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

C#如何反序列化包含动态键的嵌套数组结构JSON数据

问题解决方案

1 修复基础反序列化类型错误

你收到的初始报错核心原因是:JSON根节点是单个对象,而你试图将其反序列化为List<ModuleResult>集合类型,二者结构不匹配。
直接修改反序列化代码即可解决该报错:

// 错误写法:根节点不是数组,不能反序列化为List
// var mResults = JsonConvert.DeserializeObject<List<ModuleResult>>(jsonString);

// 正确写法
var mResults = JsonConvert.DeserializeObject<ModuleResult>(jsonString);

2 处理moduleReports内的动态字段

你定义的ModuleReport实体类已经覆盖了现有JSON中所有可能出现的字段,JSON.NET反序列化时会自动匹配存在的字段,不存在的字段会自动赋值为对应类型的默认值(可空类型为null,集合类型为null),不需要额外编写自定义反序列化逻辑。
如果后续需要兼容ModuleReport中未定义的未知字段,只需在ModuleReport类中添加标记了[JsonExtensionData]特性的字典即可自动捕获所有未知键值对:

public class ModuleReport
{
    public string completion { get; set; }
    public string thoughts { get; set; }
    public string componentTitle { get; set; }
    public DateTime? completionDate { get; set; }
    public List<string> workValues { get; set; }
    public List<string> personalityTypes { get; set; }
    public string reflection { get; set; }
    public string careerGroup { get; set; }
    public List<string> improveAtSkills { get; set; }
    public List<string> goodAtSkills { get; set; }

    // 新增:捕获所有未在上方定义的额外字段
    [JsonExtensionData]
    public Dictionary<string, JToken> ExtraFields { get; set; }
}

3 废弃原有自定义ReadJson逻辑

你之前编写的自定义转换器作用于ModuleResult层级,仅处理了firstName、lastName两个字段,未对moduleReports节点做单独的反序列化处理,所以才会将整个moduleReports数组直接存入字典。按上述两步修改后不需要使用该自定义转换器,移除即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:54:04