前提
SwiftUIでRESTAPIからJSONを取得して描画する練習コードを書いています。
取得データをJSONにデコードするところでエラーが出て解決できません。
階層構造のあるJSONの処理ができなくて困っています。
SwiftUIに詳しい方ご協力よろしくお願いいたします。
利用中の開発環境
・MacBookPro macOS Monterey Apple M1 Pro
・Xcode 13.4.1
実現したいこと
SwiftUIでRESTAPIから以下のJSONを取得して、
"datetime"と"worker_id"の値を画面に表示したい。
{ "Items": [ { "datetime": "2021-03-01 10:12:14 +0000", "worker_id": "test0001" } ], "Count": 1, "ScannedCount": 1 }
発生している問題・エラーメッセージ
エラー2 Error keyNotFound(CodingKeys(stringValue: "datetime", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"datetime\", intValue: nil) (\"datetime\").", underlyingError: nil))
該当のソースコード
swift
import SwiftUI struct Items: Codable { var datetime: String var worker_id: String} struct TestRestApi: View { /// ここの書き方もよくわかっておらず、テキトーに代入しています @State private var results: Items = Items(datetime: "test1", worker_id: "test2") var body: some View { NavigationView { VStack{ Text(results.datetime) Text(results.worker_id) } }.onAppear(perform: loadData) // データ読み込み処理 } /// データ読み込み処理 func loadData() { /// URLの生成 guard let url = URL(string: "https://b0lc580z2f.execute-api.ap-northeast-1.amazonaws.com/dev") else { /// 文字列が有効なURLでない場合の処理 return } /// URLリクエストの生成 var request = URLRequest(url: url) // POSTを指定 request.httpMethod = "POST" // content-type を application/json に設定する request.addValue("application/json", forHTTPHeaderField: "content-type") // set the request-body(JSON) POSTのテストでポストしているだけ let params: [String: Any] = [ "testNumber": "123567", ] do{ request.httpBody = try JSONSerialization.data(withJSONObject: params, options: []) }catch{ print("エラー1") print(error.localizedDescription) } /// URLにアクセス URLSession.shared.dataTask(with: request) { data, response, error in do { if let items = data { let decodedData = try JSONDecoder().decode(Items.self, from: items) self.results = decodedData } else { print("No data", data as Any) } } catch { print("エラー2") print("Error", error) } }.resume() // タスク開始処理(必須) }} struct TestRestApi_Previews: PreviewProvider { static var previews: some View { TestRestApi() }}
試したこと
struct Items: Codable { var datetime: String var worker_id: String }
ここの定義を色々変えて試しましたが、うまく行きませんでした。
0 コメント