2016-11-28 18 views
0

this question on parsing JSON in Swift 3非常に参考になりましたが、私のJSON構造に「天気」キー(赤い矢印参照)の配列があることに気付きました。私はJSON出力の他の部分を解析することができましたが、この配列は問題を引き起こしました。 Snapshot of Consoleスウィフトのネスト配列を使用したJSONの解析3

質問:このJSONデータの他の部分で機能していた[String:Any]パターンを使用できないのはなぜですか?

これはコンソールでのエラーです。「__NSSingleObjectArrayI(0x112e04be0)タイプの値を 'NSDictionary'(0x112e05108)にキャストできませんでした。

import UIKit 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let url = URL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=MYAPIKEY")! 

     let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
      if error != nil { 
       print(error) 
      }else { 
       if let urlContent = data { 
        do { 
         let parsedData = try JSONSerialization.jsonObject(with: urlContent, options: .allowFragments) as! [String:Any] 
         print(parsedData) 
         let currentCondions = parsedData["main"] as! [String:Any] 

         for (key, value) in currentCondions { 
          print("\(key) - \(value)") 
         } 

         let locationInfo = parsedData["sys"] as! [String:Any] 
         for (key, value) in locationInfo { 
          print("\(key) - \(value)") 
         } 

         let weatherMain = parsedData["weather"] as! [String:Any] 
         print(weatherMain) 

        } catch { 
         print("JSON processessing failed") 
        }//catch closing bracket 
       }// if let closing bracket 
      }//else closing bracket 
     }// task closing bracket 
     task.resume() 
    } 
} 
+0

問題は不明です。あなたのコードのどこに問題があるのですか?実際の問題は何ですか?コンパイルエラー?ランタイムエラー?予想外の結果ですか?具体的にする。 – rmaddy

+0

コードと質問をコンソールに表示するように更新しました。私は "スレッド8:シグナルSIGABRT"コンソールで次のエラーを取得します。 '__NSSingleObjectArrayI'(0x112e04be0)型の値を 'NSDictionary'(0x112e05108)にキャストできませんでした。 – brickm

答えて

3

エラーは問題がかなりいる(明確な、そしてあなたの質問の開始時に出力を見ています。「天気」キーの値は辞書ではありません。それは辞書の配列です。

したがって、この:サイドノートとして

let weatherMain = parsedData["weather"] as! [[String:Any]] 

、これまで:

let weatherMain = parsedData["weather"] as! [String:Any] 

をする必要があります!のアプリでの使用は、起こるのを待っているクラッシュです。実際にはあなたの考えではないかもしれない値を安全にラッピングし、安全にキャストする必要があります。 Swift Programming Languageの本書では、オプション、型キャスト、およびオプションの連鎖のセクションを見直し、質の高い時間を過ごすことを強くお勧めします。

+0

クイック返信と辞書と辞書の配列を説明してくれてありがとう。これが私のJSONでの最初の試みでした。あなたの答えは上にあった。私は学習者であり、簡単に困惑することがあります。私はあなたのアドバイスをアンラプチャーしないでください。私はエラー処理のあるものにラップする習慣に入るべきです。 – brickm

関連する問題