ネストされたjsonをすばやくデコードする

1
Vlad Sima 2020-07-22 08:41.

こんにちは人々私はSwiftのEncodableプロトコルに関連する小さな質問があります。

私は次のjsonファイルを持っています:

let magicJson = """
{
    "value": [
        {
        "scheduleId": "[email protected]",
        "somethingEventMoreMagical": "000220000"
        }
    ]
}
""".data(using: .utf8)!

デコードのために、両方ともDecodableに対応する2つのオブジェクトを作成する必要がないようにしました。最初のオブジェクトには、2番目のオブジェクトの配列があります。そのオブジェクトを次のようなものに平坦化したいと思います。

struct MagicalStruct: Decodable {
    private enum CodingKeys: String, CodingKey {
        case value
    }
    
    private enum ScheduleCodingKeys: String, CodingKey {
        case roomEmail = "scheduleId"
    }
    
    let roomEmail: String
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let magicContainer = try container.nestedContainer(keyedBy: ScheduleCodingKeys.self, forKey: .value)
        roomEmail = try magicContainer.decode(String.self, forKey: ScheduleCodingKeys.roomEmail)
    }
}

ただし、次のコードを試してみると、JSONDecoder().decode(MagicalStruct.self, magicJson)配列を期待しているのに辞書を取得していることがわかります。一方、と行くとJSONDecoder().decode([MagicalStruct].self, magicJson)、配列を受け取りますが、辞書を期待していることがわかります。

なぜこれが起こっているのか誰かが知っていますか?

1 answers

1
pawello2222 2020-07-22 20:02.

まず、以下を使用して構造体をデコードする場合:

JSONDecoder().decode(MagicalStruct.self, magicJson)

単一のオブジェクトを抽出しようとしています:let roomEmail: String

ただし、入力JSONには、電子メールを含むオブジェクトの配列が含まれています。それはあなたのコードを意味します:

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    let magicContainer = try container.nestedContainer(keyedBy: ScheduleCodingKeys.self, forKey: .value)
    roomEmail = try magicContainer.decode(String.self, forKey: ScheduleCodingKeys.roomEmail)
}

単一の電子メールをデコードしようとしますが、代わりにコレクションがあります(1つの要素を持つ例では、混乱する可能性があります)。

また、あなたのエラーExpected to decode Dictionary<String, Any> but found an array insteadは次の行にあります:

let magicContainer = try container.nestedContainer(keyedBy: ScheduleCodingKeys.self, forKey: .value)

配列をデコードする必要があります。

var magicContainer = try container.nestedUnkeyedContainer(forKey: .value)

しかしscheduleIdsomethingEventMoreMagical キーを持つオブジェクトの配列があります。1つのlet roomEmail: String変数にすべての値をどのように割り当てますか?


代わりに辞書をデコードできます。

let result = try JSONDecoder().decode([String: [MagicalStruct]].self, from: magicJson)

print(result["value"]!) // prints [MagicalStruct(roomEmail: "[email protected]")]

そして、あなたはあなたのを単純化することができますMagicalStruct

struct MagicalStruct: Decodable {
    enum CodingKeys: String, CodingKey {
        case roomEmail = "scheduleId"
    }

    let roomEmail: String
}

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

MacでSiriの準備をする

MacでSiriの準備をする

Siriは携帯電話をヒットした最初の音声アシスタントであり、それ以来、時々風変わりな機能がAppleWatchや新しいAppleTVを含むすべてのAppleデバイスに浸透してきました。さて、9to5Macによると、Siriの征服は、今年ようやくMacに登場することで完了します。

あなたの好きなコーヒーメーカーは何ですか?

あなたの好きなコーヒーメーカーは何ですか?

最初の一杯のコーヒーを手に入れるまで、その日は本当に始まっていませんが、誰もがエアロプレスやポアオーバーデカンターで手の込んだ式典を行う時間がないので、手動のコーヒー方法には間違いなく問題はありませんが(実際、私たちはそれらが大好きです)、今週、私たちは特にあなたのお気に入りの自動コーヒーメーカーを見つけたいと思っています。

自動運転車は2020年までに道路に出るでしょうが、米国の都市はそれらの準備ができていません

自動運転車は2020年までに道路に出るでしょうが、米国の都市はそれらの準備ができていません

少なくとも7つの自動運転車プログラムが2020年までに路上での準備が整うことを誓っていますが、真実は、米国の都市はこの現実に対してひどく準備ができていないということです。米国の最大の都市のわずか6%が、長距離輸送計画に自動運転車に関する言葉を含んでいます。

これがあなたの「これは私ができる最高のことです」ジュラシック・ワールドのハロウィンコスチューム

これがあなたの「これは私ができる最高のことです」ジュラシック・ワールドのハロウィンコスチューム

今年のコスチュームを決めるために最後の最後まで待つのではなく、ハロウィーンの前日にアマゾンからこのジュラシックワールドインフレータブルT-rexゲットアップを注文して、コスチュームゲームを少し上げてみませんか?ただし、それほど多くはありません。付属のバッテリー-作動するポンプは、あなたが中に隠れている間、70ドルのコスチュームを膨らませ続けます、そしてあなたが振り返るたびにあなたはテーブルから飲み物とキャンディーをノックするので、長い尾はあなたがどんなハロウィーンパーティーの悩みの種になることを保証します。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

ケイト・ミドルトンはロンドンの水辺で一日を過ごし、さらにジェニファー・ロペス、ジュリアン・ハフなど

ケイト・ミドルトンはロンドンの水辺で一日を過ごし、さらにジェニファー・ロペス、ジュリアン・ハフなど

ケイト・ミドルトンはロンドンの水辺で 1 日を過ごし、ジェニファー・ロペス、ジュリアン・ハフなども。ハリウッドからニューヨークまで、そしてその間のあらゆる場所で、お気に入りのスターの活躍をご覧ください!

ウィスコンシン川でのナイフ攻撃で 17 歳の少年が刺されて死亡、他の 4 人が負傷したままになっている

ウィスコンシン川でのナイフ攻撃で 17 歳の少年が刺されて死亡、他の 4 人が負傷したままになっている

捜査官は、グループと容疑者が攻撃の前にお互いを知っていたかどうかを調べています

書き方

書き方

私にとって、すべてはその最初の行とそれがあなたをどこに連れて行くかについてです. プロットやチェスの駒の繊細な配置に突き動かされる作家もいれば、登場人物や新しい架空の友人との旅に出る能力に引き込まれる作家もいます。

滑走路着陸

滑走路着陸

晩夏と秋はノスタルジックな季節。街灯は雨で濡れた通りに光を放ち、足元の葉 - 夕暮れの影の中で落ち着いた赤オレンジ - は過ぎ去った日々を思い出させます。

実際に変換するコンテンツ戦略を作成することを想像してみてください。それが可能だ。

実際に変換するコンテンツ戦略を作成することを想像してみてください。それが可能だ。

2021 年には、サービスを提供する顧客と顧客に伝えるストーリーについて知っていることをすべて再考することをお勧めします。あとずさりする。

マンモスロスは私の心を愛に開いた

マンモスロスは私の心を愛に開いた

フェリックス ザ キャットの 9 歳の誕生日の日に、大人になってからの最大の損失の 1 つである 2013 年のソフィーを思い出します。私はこのエッセイを書き、2013 年にこのプラットフォームで簡単に共有しました。

Language