APIとの通信ができない以前のこの質問でAPIからJsonの文字列を取得することはできたのですが、ここからCodableで作ったオブジェクトの中に情報を持たせることができません。
Swift Jsonで検索したところCodableを使う方法がたくさん紹介されていたので真似して作ってみました。要素が多かったので、まずはおためしでCoordとWetherの要素を取得しようと思いました。
Swift
1struct Root: Codable{ 2 var coord: Coord 3 var weather: Weather 4} 5struct Coord: Codable { 6 var lon:Int 7 var lat:Int 8} 9struct Weather: Codable { 10 var id:Int 11 var main:String 12 var description:String 13 var icon:String 14} 15
Coodableに関しての記事はたくさんあったのですが、実際にCodableのオブジェクトの中にJsonデータを格納する部分の記事がみつかりませんでした。
無理やり試したみたのですが、jsonStringに文字列として格納する際に処理落ちしてしまいました。
Swift
1task = URLSession.shared.dataTask(with: request) { (data, response, error) in 2 guard let data = data else{return} 3 var jsonString:String! 4 do{ 5 //データをjson形式で保存 6 let object:Any = try JSONSerialization.jsonObject(with: data, options: []) 7 //ここで落ちてしまいます 8 jsonString = object as? String 9 10 print(object) 11 } catch let e { 12 print(e) 13 } 14 var jsonData = try! JSONDecoder().decode(Root.self, from: jsonString.data(using: .utf8)!) 15 16 } 17 task.resume()
参考にしたクラスメソッドさんの記事に乗っていたのは,
Swift
1var jsonData = try! JSONDecoder().decode(Root.self, from: jsonString.data(using: .utf8)!)
この1行だけだったので、この記述の形式を崩さないようにやってみたのですが、うまくいきませんでした。
※追記
貼ってくださったURLのコードを真似してtaskないの処理を下記のようにしたのですが、エラーにキャッチされてしまうようになりました。
dataが0bytesとなっているのでこの方法だとAPIからそもそもデータが取れないのかもしれません
Swift
1task = URLSession.shared.dataTask(with: request) { (data, response, error) in 2 guard let data = data else{return} 3 do{ 4 //データをjson形式で保存 5 let jData = try JSONDecoder().decode(Root.self, from: data) 6 print(jData.coord.lat) 7 } catch let e { 8 print(e) 9 } 10 }
回答1件
あなたの回答
tips
プレビュー