前提
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
1import SwiftUI 2 3struct Items: Codable { 4 var datetime: String 5 var worker_id: String 6} 7 8struct TestRestApi: View { 9 10/// ここの書き方もよくわかっておらず、テキトーに代入しています 11 @State private var results: Items = Items(datetime: "test1", worker_id: "test2") 12 13 var body: some View { 14 NavigationView { 15 VStack{ 16 Text(results.datetime) 17 Text(results.worker_id) 18 } 19 }.onAppear(perform: loadData) // データ読み込み処理 20 } 21 /// データ読み込み処理 22 func loadData() { 23 24 /// URLの生成 25 guard let url = URL(string: 26 "https://b0lc580z2f.execute-api.ap-northeast-1.amazonaws.com/dev") else { 27 /// 文字列が有効なURLでない場合の処理 28 return 29 } 30 31 /// URLリクエストの生成 32 var request = URLRequest(url: url) 33 34 // POSTを指定 35 request.httpMethod = "POST" 36 37 // content-type を application/json に設定する 38 request.addValue("application/json", forHTTPHeaderField: "content-type") 39 40 // set the request-body(JSON) POSTのテストでポストしているだけ 41 let params: [String: Any] = [ 42 "testNumber": "123567", 43 ] 44 45 do{ 46 request.httpBody = try JSONSerialization.data(withJSONObject: params, options: []) 47 }catch{ 48 print("エラー1") 49 print(error.localizedDescription) 50 } 51 52 /// URLにアクセス 53 URLSession.shared.dataTask(with: request) { data, response, error in 54 55 do { 56 if let items = data { 57 let decodedData = try JSONDecoder().decode(Items.self, from: items) 58 self.results = decodedData 59 } else { 60 print("No data", data as Any) 61 } 62 } catch { 63 print("エラー2") 64 print("Error", error) 65 } 66 67 }.resume() // タスク開始処理(必須) 68 69 } 70} 71 72struct TestRestApi_Previews: PreviewProvider { 73 static var previews: some View { 74 TestRestApi() 75 } 76}
試したこと
struct Items: Codable { var datetime: String var worker_id: String }
ここの定義を色々変えて試しましたが、うまく行きませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/25 10:00