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

将JSON反序列化为C#对象列表时遇Newtonsoft.Json序列化异常

JSON转C#对象列表报错的解决方法

问题原因

你用List<Root>去反序列化JSON,但你的JSON是键值对对象(外层用{}包裹,键是员工编号如"50010"),而List<T>要求JSON是数组格式(用[]包裹),类型不匹配导致抛出JsonSerializationException。

解决方案

1. 更换反序列化目标类型

直接把目标类型换成Dictionary<string, Root>,完美匹配JSON的键值对结构:

// 反序列化为字典,键是员工编号,值是员工数据
Dictionary<string, Root> employeeDict = JsonConvert.DeserializeObject<Dictionary<string, Root>>(json);

// 如果需要转为List<Root>,提取字典的值即可
List<Root> employeeList = employeeDict.Values.ToList();

2. 定义正确的C#实体类

根据JSON结构,需要定义两个实体类:

// 员工总数据类
public class Root
{
    public string name { get; set; }
    public int isInProduction { get; set; }
    public double total_hours { get; set; }
    public int total_overjob_hours { get; set; }
    public int total_days { get; set; }
    public int total_vacation { get; set; }
    public int total_sick { get; set; }
    public int total_work_Sunday { get; set; }
    public int total_work_Saturday { get; set; }
    public int total_shift_Adm { get; set; }
    public int total_shift_1 { get; set; }
    public int total_shift_2 { get; set; }
    public int total_shift_3 { get; set; }
    
    // 动态日期字段用字典接收(day_02、day_03等)
    [JsonExtensionData]
    public Dictionary<string, JToken> DailyData { get; set; }
}

// 单日数据类
public class DayData
{
    public string comment { get; set; }
    public double hours { get; set; }
    public int shift { get; set; }
}
  • 用[JsonExtensionData]特性可以自动把所有未定义的动态字段(比如day_xx)存入DailyData字典,后续可以通过JToken.ToObject<DayData>()把单个日期数据转为DayData对象:
// 示例:提取day_02的数据
DayData day02 = employeeDict["50010"].DailyData["day_02"].ToObject<DayData>();

3. 验证结果

替换类型和定义类后,重新运行反序列化代码,就能正确解析JSON中的所有数据了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:32:35