C# で動的に名前が付けられたサブオブジェクトの JSON 逆シリアル化
動的に名前が付けられたサブオブジェクトを含む JSON 構造の逆シリアル化の処理は困難な場合があります。次の JSON の例を考えてみましょう:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <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>
|
ログイン後にコピー
次のコードを使用して逆シリアル化しようとすると失敗する可能性があります:
1 2 3 4 5 6 7 8 9 10 11 12 | <code class = "language-csharp" > public class RootObject
{
public string ParentName { get; set; }
public Dictionary<string, User> users { get; set; }
}
public class User
{
public string name { get; set; }
public string state { get; set; }
public string id { get; set; }
}</code>
|
ログイン後にコピー
これは、RootObject
クラス内の既知のプロパティ名が JSON 内の子オブジェクトの動的名と一致しないためです。
解決策は、カスタム コンバータを使用して動的プロパティ名を処理し、それらを厳密に型指定されたオブジェクトの辞書に逆シリアル化することです。これを行うには、次のものが必要です:
-
JsonConverter
を継承するコンバーター クラスを作成し、逆シリアル化およびシリアル化ロジックを提供します:
1 | <code class = "language-csharp" > public class TypedExtensionDataConverter<T> : JsonConverter
|
ログイン後にコピー
-
[JsonTypedExtensionData]
属性を使用して、動的に名前が付けられたオブジェクトのディクショナリを保持するデータ モデル内の属性をマークします。
1 2 3 4 5 6 7 8 9 | <code class = "language-csharp" > [JsonConverter(typeof(TypedExtensionDataConverter<User>))]
class Users
{
[JsonProperty( "parentname" )]
public string ParentName { get; set; }
[JsonTypedExtensionData]
public Dictionary<string, User> UserTable { get; set; }
}</code>
|
ログイン後にコピー
-
動的サブオブジェクトを正しく処理するためにデータ モデルを更新しました:
1 2 3 4 5 | <code class = "language-csharp" > public class RootObject
{
[JsonProperty( "users" )]
public Users Users { get; set; }
}</code>
|
ログイン後にコピー
カスタム コンバーターを使用すると、JSON 構造を厳密に型指定された C# オブジェクト モデルに正常に逆シリアル化できるため、元のデータの階層構造と動的な性質が維持されます。
以上がC# で動的に名前が付けられた子オブジェクトを使用して JSON を逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。