You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写泛型类正确反序列化带动态键的Authors数据?

解决动态键JSON的反序列化问题

问题场景

你需要反序列化的核心JSON结构如下:

"object":{
    "type":"ABC",
    "year":2022,
    "authors":{
       "hh5as666asd66asd":{
          "name":"Name",
          "lastName":"LastName"
       }
    }
}

当前定义的Object实体类无法正确处理authors的动态随机键,需要调整类型以支持单个或多个作者的反序列化。

解决方案

1. 定义作者实体类

先创建对应单个作者信息的实体类:

public class Author
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("lastName")]
    public string LastName { get; set; }
}

2. 修改主实体类的Authors属性类型

由于authors是动态键值对结构,直接用Dictionary<string, Author>替代原有的Authors类即可,Newtonsoft.Json会自动将动态键的JSON对象反序列化为字典,天然支持单个或多个作者的情况:

public class Object
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("year")]
    public int Year { get; set; }

    [JsonProperty("authors")]
    public Dictionary<string, Author> Authors { get; set; }      
}

3. 泛型扩展方案(可选)

如果需要复用动态键结构的处理逻辑,可以封装一个泛型类来承载动态键数据:

public class DynamicKeyContainer<T> : Dictionary<string, T>
{
    // 继承Dictionary,无需额外代码,直接复用字典的序列化/反序列化能力
}

此时主实体类可改为:

public class Object
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("year")]
    public int Year { get; set; }

    [JsonProperty("authors")]
    public DynamicKeyContainer<Author> Authors { get; set; }      
}

4. 反序列化代码保持不变

原有的反序列化代码无需修改,即可正常工作:

var result = JsonConvert.DeserializeObject<MyClass>(response.Content);

(注:这里的MyClass需包含Object类型的属性,对应JSON根节点的"object"字段)

说明

  • 字典的键对应JSON里的动态随机字符串,值对应作者的详细信息
  • 无论authors里有1个还是多个作者,字典都能正确接收数据
  • 泛型容器类主要用于复用动态键结构的处理逻辑,若仅处理作者场景,直接用Dictionary<string, Author>更简洁

内容的提问来源于stack exchange,提问作者mchmielowiec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 07:36:20