将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
相关产品推荐
相关产品推荐

