2016-12-02 3 views
0

Я новичок в Alamofire, я тестировал API. Я столкнулся с валютными курсами. Таким образом, файл в формате JSON, как этоAlamofire 4.0 JSOn parsing Swift

["base": CAD, "date": 2016-12-01, "rates": { 
AUD = "1.0097"; 
BGN = "1.3735"; 
BRL = "2.57"; 
CHF = "0.7559"; 
CNY = "5.1388"; 
CZK = "19.004"; 
DKK = "5.2248"; 
EUR = "0.70225"; 
GBP = "0.59058"; 
HKD = "5.7881"; 
HRK = "5.2985"; 
HUF = "220.48"; 
IDR = 10108; 
ILS = "2.8607"; 
INR = "51.009"; 
JPY = "85.246"; 
KRW = "871.9400000000001"; 
MXN = "15.403"; 
MYR = "3.331"; 
NOK = "6.2941"; 
NZD = "1.0539"; 
PHP = "37.102"; 
PLN = "3.1374"; 
RON = "3.1631"; 
RUB = "47.591"; 
SEK = "6.8775"; 
SGD = "1.0657"; 
THB = "26.616"; 
TRY = "2.6006"; 
USD = "0.7462800000000001"; 
ZAR = "10.504";}] 

typealias JSONStandard = [String: AnyObject] 

func parseData(JSONData:Data) { 
    do { 
     var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard 
     if let rates = readableJSON["rates"] as? JSONStandard{ 
      for i in 0..<rates.count { 
       let rate = rates[i] as! //Here 
      } 
      print(rates) 
     } 
     print(readableJSON) 

    } catch { 
     print(error) 
    } 
} 

Я был в состоянии получить побочные «ставки», но я не понимаю, как я хотел бы разобрать все данные внутри «ставки». Я думал, что мне нужно будет сохранить его в словаре. очень запутанные Благодаря

+0

Это даже не является допустимым набором данных. Он не должен включать точку с запятой. –

+0

@ElTomato, что на самом деле так верно, я просто понимаю это. Но я уверен, что вокруг него есть способ. –

+0

Нет никакого способа обойти это. Вы можете, конечно, исправить свой набор данных JSON вручную и прочитать его как файл Swift. –

ответ

0

Как вы можете видеть, что это двойное значение в строки, так что вам нужно преобразовать AnyObject в строку, а затем преобразовать его в Дважды. Вы можете сделать это следующим образом (испытано на Swift игровой площадке):

import Foundation 

typealias JSONStandard = [String: AnyObject] 

func parseData(JSONData:Data) { 
    do { 
     guard let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as? JSONStandard, 
      let ratesJSON = readableJSON["rates"] as? JSONStandard 
      else { return } 
     print("Readable JSON :") 
     print(readableJSON) 
     let rates = ratesJSON.flatMap({ (key, value) -> ([String: Double]) in 
      guard let value = value as? String, let convertedValue = Double(value) else { return [:] } 
      return [key: convertedValue] 
     }) 
     print("Rates :") 
     print(rates) 

    } catch { 
     print(error) 
    } 
} 

let jsonString = "{\"base\": \"CAD\", \"date\": \"2016-12-01\", \"rates\": { \"AUD\": \"1.0097\", \"BGN\": \"1.3735\", \"BRL\": \"2.57\"}}" 
let jsonData = jsonString.data(using: String.Encoding.utf8)! 
parseData(JSONData: jsonData) 

Результат:

Readable JSON : 
["base": CAD, "date": 2016-12-01, "rates": { 
    AUD = "1.0097"; 
    BGN = "1.3735"; 
    BRL = "2.57"; 
}] 
Rates : 
[("BGN", 1.3734999999999999), ("AUD", 1.0097), ("BRL", 2.5699999999999998)] 
+0

Возможно ли, чтобы вы рассказали мне об использовании детали охраны? –

+0

@ J.Kim1205 guard похож на if, но он проверяет только, является ли условие истинным или нет, его также называют шаблоном вышивки. Таким образом, это будет работать как это условие охраны else {// ваш код и return}, если условие истинно, оно перейдет к следующей строке, если оно не перейдет в другой блок, здесь также есть хорошее объяснение -> http : //ericcerney.com/swift-guard-statement/ –

+0

jsonString.data? где это от –

0

Вы должны сохранить его в массив Double:

var yourArray = [Double]() 

    for i in 0..<rates.count { 
     let rate = rates[i] as! Double 
     print(rate) 
     yourArray.append(rate) 
    } 

print(yourArray.description) 
+0

, что означает, что я плохо сохраню свои двойные значения, я тоже хочу сохранить свою строку –