首页 > 后端开发 > C++ > 如何在 C# 中使用动态命名子对象反序列化 JSON?

如何在 C# 中使用动态命名子对象反序列化 JSON?

Patricia Arquette
发布: 2025-01-13 18:52:45
原创
762 人浏览过

How to Deserialize JSON with Dynamically Named Child Objects in C#?

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中子对象的动态名称不匹配。

解决方案是使用自定义转换器来处理动态属性名称并将它们反序列化为强类型对象的字典。为此,需要:

  1. 创建一个继承自JsonConverter的转换器类,并提供反序列化和序列化的逻辑:

    <code class="language-csharp"> public class TypedExtensionDataConverter<T> : JsonConverter // ... 实现略 ...</code>
    登录后复制
  2. 使用[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>
    登录后复制
  3. 更新数据模型以正确处理动态子对象:

    <code class="language-csharp"> public class RootObject
     {
         [JsonProperty("users")]
         public Users Users { get; set; }
     }</code>
    登录后复制

通过使用自定义转换器,可以成功地将JSON结构反序列化为强类型的C#对象模型,从而保留原始数据的层次结构和动态特性。

以上是如何在 C# 中使用动态命名子对象反序列化 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板