首页 > 后端开发 > C++ > 如何使用 Newtonsoft.Json 反序列化带有动态数字键的 JSON?

如何使用 Newtonsoft.Json 反序列化带有动态数字键的 JSON?

DDD
发布: 2025-01-13 19:07:44
原创
693 人浏览过

How to Deserialize JSON with Dynamic Numeric Keys Using Newtonsoft.Json?

如何反序列化具有动态(数字)键名的子对象?

当处理包含具有动态键名的子对象的复杂JSON结构时,使用Newtonsoft JSON.NET对其进行反序列化可能会带来挑战。本文将深入探讨涉及此类结构的场景,并提供使用自定义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>
登录后复制

在此结构中,“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转换器

为了解决这个问题,需要一个自定义JSON转换器。TypedExtensionDataConverter优雅地解决了这个问题。以下是代码:

<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter
{
    // ... [此处省略实现,篇幅原因]
}</code>
登录后复制

此转换器允许将未知属性反序列化到类型化容器中,在本例中为User对象的字典:

<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中文网其他相关文章!

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