如何编写泛型类正确反序列化带动态键的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
相关产品推荐
相关产品推荐

