2017-08-18 29 views
0

私はこれは私が持っている現在のコードは、しかし、私はそれを実行するだけでプリント(JSONである私は、プロジェクト内でローカルに持っていることにJSONファイルから通貨とそのシンボルのリストを印刷するローカルJSONからJSONデータを解析する方法ファイルswift 3?

guard let path: String = Bundle.main.path(forResource: "Common-Currency", ofType: "json") else {return} 
    let url = URL(fileURLWithPath: path) 

    do { 
     let jsonData = try Data(contentsOf: url) 
     let json = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) 
     print(json) 

     guard let jsonArray = json as? [Any] else { return } 

     for currency in jsonArray { 
      guard let eachCurrency = currency as? [String: Any] else {return} 
      guard let currencyName = eachCurrency["code"] else {return} 
      guard let currencySymbol = eachCurrency["symbol_native"] else {return} 

      print(currencyName) 
      print(currencySymbol) 
     } 
    } 
    catch { 
     print(error) 
    } 

をしようとしています)コマンドが実行され、他の2枚の印刷は実行されません。私は間違って何をしていますか?ルートオブジェクトが辞書[String:Any]ある

{ 

"Currencies" : { 
"USD": { 
    "symbol": "$", 
    "name": "US Dollar", 
    "symbol_native": "US$", 
    "decimal_digits": 2, 
    "rounding": 0, 
    "code": "USD", 
    "name_plural": "US dollars" 
}, 
"CAD": { 
    "symbol": "CA$", 
    "name": "Canadian Dollar", 
    "symbol_native": "CA$", 
    "decimal_digits": 2, 
    "rounding": 0, 
    "code": "CAD", 
    "name_plural": "Canadian dollars" 
}, 
"EUR": { 
    "symbol": "€", 
    "name": "Euro", 
    "symbol_native": "€", 
    "decimal_digits": 2, 
    "rounding": 0, 
    "code": "EUR", 
    "name_plural": "euros" 
}, 
"AED": { 
    "symbol": "AED", 
    "name": "United Arab Emirates Dirham", 
    "symbol_native": "د.إ.‏", 
    "decimal_digits": 2, 
    "rounding": 0, 
    "code": "AED", 
    "name_plural": "UAE dirhams" 
}, 
"AFN": { 
    "symbol": "Af", 
    "name": "Afghan Afghani", 
    "symbol_native": "؋", 
    "decimal_digits": 0, 
    "rounding": 0, 
    "code": "AFN", 
    "name_plural": "Afghan Afghanis" 
}, 
+1

JSON文字列の先頭を投稿してください。 'json'はおそらく辞書です。ファイルがバンドルに含まれている場合は、すべての 'guard'式とオプションのバインディングは必要ありません。すべての辞書値を強制的にアンラップします。コードがクラッシュすると、設計上のエラーになります。 – vadian

+0

'json'は本当に配列ですか?それを表示できますか? – Larme

+0

これで今すぐ追加しました –

答えて

1

JSONは次のようになります。通貨は、辞書でもあるキーcurrenciesの値です。

あなたは、キーを取得し、それらをソートし、キーで通貨辞書を取得する必要がアルファベット順について

let url = Bundle.main.url(forResource: "Common-Currency", withExtension: "json")! 
do { 
    let jsonData = try Data(contentsOf: url) 
    let json = try JSONSerialization.jsonObject(with: jsonData) as! [String:Any] 
    print(json) 

    let currencies = json["Currencies"] as! [String: [String:Any]] 

    for (key, currency) in currencies { 
     let currencyName = currency["name"] as! String 
     let currencySymbol = currency["symbol_native"] as! String 

     print(key) // == `code` 
     print(currencyName) 
     print(currencySymbol) 
    } 
} 
catch { 
    print(error) 
} 

と通貨情報を取得します。

 let currencies = json["Currencies"] as! [String: [String:Any]] 
     let currencyCodes = currencies.keys.sorted() 

     for code in currencyCodes { 
      let currency = currencies[code]! 
      let currencyName = currency["name"] as! String 
      let currencySymbol = currency["symbol_native"] as! String 

      print(code) 
      print(currencyName) 
      print(currencySymbol) 
     } 
+0

このコード行で、「let currency = json ["currency"] as![文字列:[String:Any]] "スレッド1のEXC_BAD_INSTRUCTIONエラーが発生しました –

+0

キーが始まります資本「C」である。私は答えを編集しました。 – vadian

+0

ありがとう、魅力的なように働いた。また、なぜそれが順番に印刷されないのか分かりませんか? –

関連する問題