C#中动态命名子对象的JSON反序列化
处理具有动态命名子对象的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>
尝试使用以下代码进行反序列化可能会失败:
<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
的转换器类,并提供反序列化和序列化的逻辑:
<code class="language-csharp"> public class TypedExtensionDataConverter<T> : JsonConverter // ... 实现略 ...</code>
使用[JsonTypedExtensionData]
属性标记数据模型中将保存动态命名对象的字典的属性:
<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>
更新数据模型以正确处理动态子对象:
<code class="language-csharp"> public class RootObject { [JsonProperty("users")] public Users Users { get; set; } }</code>
通过使用自定义转换器,可以成功地将JSON结构反序列化为强类型的C#对象模型,从而保留原始数据的层次结构和动态特性。
以上是如何在 C# 中使用动态命名子对象反序列化 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!