SwiftUIでJsonデータを扱うのは難しい
SwiftUIでネストJsonデータをパースして、Viewに表示しようと思っているが、うまくいかずにハマっている。まだ未解決。色んなエラーが次から次へと出てくる。ハマりすぎてネガティブになるので、まずできたことのリスト化をやってみる。
<できたこと>
なんとかJsonデコードの際のエラーは無くなった。
←Swiftは型にうるさい。Nilにもうるさい。
←エラー表示の内容が明確でないことがよくあることが分かった。結局、問題はModelのデータをオプショナルに対応させるだけだった。
←Jsonデータ内のTrailing commaは問題ではなかった。
←APIでのJsonデータ生成に注意する。名前の不一致などはだめ。
第一階層のデータはViewで表示できるようになった。
←List内でループを使えばOK
←早い段階でできていたが、第二で捕まった。
←printで全体的なデータを表示することはできる。
<できないこと>
第二階層のデータが表示できない。第二階層内のKeyとValueがしっかり認識されていないので、個々のオブジェクトを呼び出すことができない。
←LIst内にListCellViewを作り、その中でForEachを使って、表示しようとしてる。
←ForEachの使い方も、色々あって、複雑。どれを使えばいいのか?
<解決策候補>
1 第二階層データを無視して、進む。Swift内で第二階層データを作ってしまう。もしくは、元データの第二階層データを第一階層に送ってしまう。←一番簡単そう。
→これはできそうだが、ネストJsonデータの取扱いは、未解決、不理解のままになる。
2 とりあえず、頑張って理解し、第二階層データの取扱いについて、研究する。
→検索しても、なかなかしっくりした回答が出てこない。みんな苦労しているようだ。
→一番怪しいと思っているのは、Modelの定義のところ。ネストArray?Dictionary?(明確なカテゴリ不明)。とりあえず、ネストなので、通常の定義の仕方ではダメなのかな。
上のチュートリアルみたいなのをすれば、いけるのかな?こんな定義方法を他のサイトでしているのを見たことないのだが。。でもオフィシャルサイトだし正しいのだろう。
とりあえず、解決策2をやってみてから、無理そうなら解決策1をするかな。。
後ほど、結果を書こうと思う。
参考リンク
(2024年3月20日追記)
さて、数日間ネットを検索し続け、Appleのオンラインマニュアルを見つめ続けた結果です。残念ながら、自分が考えていた問題の原因が全く違うところにあったことがわかりました。
根本的な原因は、APIからのレスポンスJSONデータのキャッシュでした。思いもよらず絶句しました。確かにJsonデータのフォーマットは頻繁に変えていましたが、まさかこのデータがキャッシュされていたとは。。ブラウザ側のキャッシュはいつも削除してましたが、まさかSwift側でもキャッシュされていたとは。完全にやられました。
キャッシュを削除するコードはこちら。レファレンスサイト
URLCache.shared.removeAllCachedResponses()
これを、URLSessionの前に置くだけでキャッシュが削除できました。
ちなみに、Xcode内の機能"Clean Build Folder"ではこのキャッシュを削除できなかった。
でも、なんかおかしいと思っただよな。ネットではそんなにネスト型JSONでハマっている人は少なそうに見えたので。何件かは、深くハマってそうなのがあった。
自分も今回はかなり深くハマったので、もう振り返らず、早々に次の課題に進もうと思う。
今回、学んだこと。Json Parseは奥が深い。Dictionary、Array、Tupleなどの深掘りが必要(時間がある時)。APIと繋げるのは、デバグするのが大変。どこに問題があるのか分かりにくい。
今回の解決の糸口となったのは、↓のコード。これをつけてビルドすると、Xcodeのコンソールに、Jsonレスポンスを表示してくれる。
let json = try? JSONSerialization.jsonObject(with: data, options: [])
print("json: ", json as Any)
その表示内容とAPIの出力結果を比較するとデータが違ってたので、何かがおかしいことに気がついた。
他にもデータの表示方法はあるけど、この出力の方法が一番分かりやすく出てくる。
やはり、新しい言語を学んで実践するときに必要な一番必要なスキルは、デバグ(問題解決)かな。経験を積んでいけばそのうち解決策も早めに見つけられるのだろう。
この記事が気に入ったらサポートをしてみませんか?