今回のような JSON オブジェクトが入れ子になった構造を Codable で扱うときは、それぞれの JSON 型
を意識して、それごとに分けて型を定義すると考えるとわかりやすいかもしれません。
挙げてくださった JSON を少し直す必要がありそうでしたので、次のように直しますけれど、これについて考えていきます。
json
1[
2 {
3 "キー1":"値1",
4 "キー2":{"キー3":"値3","キー4":["値4−1","値4−2"]},
5 "キー5":{"キー6":"値6","キー7":"値7","キー8":"値8"}
6 },
7]
[Data] 型
- まず、いちばん外側は
JSON の配列型
になっています。
- 配列オブジェクトの中には
JSON のオブジェクト型
になっています。
ここまでは、既に質問で挙げられている通り、内側の JSON オブジェクト型
を独自に定義した Data 型
で表現していて、それの配列なので [Data] 型
で扱っています。
Data 型
このような要領で、次のように Data 型
の内容を考えていきます。
- キー1の値は
JSON の文字列型
になっています。
- キー2の値は、
JSON オブジェクト型
になっています。
- キー5の値は、
JSON オブジェクト型
になっています。
ここで キー1
の値の JSON の文字列型
は Swift の String 型
で表現できるので、残りの キー2
の値と キー5
の値のそれぞれを表現していきます。これらはそれぞれ JSON オブジェクト型
なので、それらを表現できる型をさらに定義してみます。
キー2型
まず、キー2
の値をピックアップすると、次のようになっています。
json
1{"キー3":"値3","キー4":["値4−1","値4−2"]}
これは JSON オブジェクト型
で、次の2つのキーと値の組み合わせを持っています。
- キー3 ⋯
JSON 文字列型
の値
- キー4 ⋯
JSON 配列型
の値
このとき キー4
は、内容が全て文字列型の配列なので、これは [String]
型で表現できます。
つまり、ここでは既存の型を使って次のように、この JSON オブジェクト
を表現できる型が作れます。
swift
1struct キー2型 : Codable {
2
3 var キー3: String
4 var キー4: [String]
5}
この型で キー2
の値を表現できました。
キー5型
続いて キー5
についても考えてみます。
今回の場合は キー5
の値は JSON オブジェクト型
ですけれど、それが扱う値は全て文字列型なので [String : String]
型を使って表現できます。これは Codable に対応しているので、これをそのまま使ってもいいですし、先ほどの キー2
と同じ要領で独自の型を追加定義することも可能です。
独自の型を追加定義する場合は、先ほどのように値を切り出してみると考えやすくなります。
json
1{"キー6":"値6","キー7":"値7","キー8":"値8"}
これを順番に整理すると⋯
- キー6の値は
JSON 文字列型
です。
- キー7の値は
JSON 文字列型
です。
- キー8の値は
JSON 文字列型
です。
これを型で表現すると、次のようにかけます。
swift
1struct キー5型 : Codable {
2
3 var キー6: String
4 var キー7: String
5 var キー8: String
6}
このようにとてもシンプルな構造なので、慣れないうちは先にこちらを理解してから、改めて キー2型
がなんでそうなるかを考えると理解できると思います。
Data 型を完成させる
このようにして、各キーの値を Swift の型で表現できるようになったら、さらにこれまでと同じ要領で Data
型を定義することができます。
swift
1struct Data : Codable {
2
3 var キー1: String
4 var キー2: キー2型
5 var キー5: キー5型
6}
これで、今回の課題の JSON 文字列を読み込めるようになったと思います。
試してみてください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/12 03:29
2021/03/13 10:27
2021/03/13 10:29