動的なキー名を持つサブオブジェクトを含む複雑な JSON 構造を扱う場合、Newtonsoft JSON.NET を使用してそれらを逆シリアル化すると課題が生じる可能性があります。この記事では、そのような構造が関係するシナリオを詳しく掘り下げ、カスタム JSON コンバーターを使用した完全なソリューションを提供します。
次の JSON 構造について考えてみましょう:
<code class="language-json">{ "users" : { "parentname":"test", "100034" : { "name" : "tom", "state" : "WA", "id" : "cedf-c56f-18a4-4b1" }, "10045" : { "name" : "steve", "state" : "NY", "id" : "ebb2-92bf-3062-7774" }, "12345" : { "name" : "mike", "state" : "MA", "id" : "fb60-b34f-6dc8-aaf7" } } }</code>
この構造では、「users」オブジェクトには、既知のプロパティ (「parentname」) と未知のプロパティ (子オブジェクトを表す数値キー) が混在しています。目標は、この構造を C# オブジェクト モデルに逆シリアル化し、サブオブジェクトが厳密に型指定されたクラスとして表現されるようにすることです。
標準の JSON.NET コードを使用して JSON を逆シリアル化する最初の試みは次のようになります:
<code class="language-csharp">class RootObject { public string ParentName { get; set; } public Dictionary<string, User> users { get; set; } } class User { public string name { get; set; } public string state { get; set; } public string id { get; set; } }</code>
「users」オブジェクトに不明なプロパティがあるため、このオブジェクト モデルへの逆シリアル化は失敗します。 JSON.NET はデフォルトでプロパティ名がクラス プロパティと一致することを期待しており、数値キーが User クラスのどのプロパティにも対応していないため、逆シリアル化プロセスは失敗します。
この問題を解決するには、カスタム JSON コンバーターが必要です。 TypedExtensionDataConverter
この問題をエレガントに解決します。コードは次のとおりです:
<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter { // ... [此处省略实现,篇幅原因] }</code>
このコンバーターを使用すると、未知のプロパティを 型付き コンテナー (この場合はユーザー オブジェクトのディクショナリ) に逆シリアル化できます:
<code class="language-csharp">[JsonConverter(typeof(TypedExtensionDataConverter<Users>))] class Users { public Users() { this.UserTable = new Dictionary<string, User>(); } [JsonProperty("parentname")] public string ParentName { get; set; } [JsonTypedExtensionData] public Dictionary<string, User> UserTable { get; set; } }</code>
JsonTypedExtensionDataAttribute
を使用することで、コンバーターは未知のプロパティを UserTable
ディクショナリにシリアル化/逆シリアル化することを認識します。
カスタム コンバーターを使用すると、完全なソリューションは次のようになります:
<code class="language-csharp">class RootObject { [JsonProperty("users")] public Users Users { get; set; } } [JsonConverter(typeof(TypedExtensionDataConverter<Users>))] class Users { // ... [如上实现] } class User { // ... [不变] }</code>
逆シリアル化された JSON 構造は、RootObject
オブジェクト内の Users
ディクショナリに格納されているサブオブジェクトを含む、期待される値を UserTable
に設定します。
以上がNewtonsoft.Json を使用して動的数値キーを使用して JSON を逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。