反序列化JSON到对象列表时遇JsonSerializationException错误求助
排查JSON反序列化为List的JsonSerializationException错误
我来帮你一步步定位这个问题,这种错误大多是JSON结构和目标对象不匹配,或者JSON本身有语法问题导致的,咱们从这几个方向逐一排查:
1. 先确认JSON的语法完整性
你提供的JSON片段末尾是截断的(最后是30...),这首先要检查完整的JSON是否是有效的:
- 确保所有字符串都有闭合的双引号,数组的
[]是成对的,每个对象的{}也都正确收尾 - 可以用VS自带的JSON编辑器(新建一个.json文件粘贴内容),它会实时提示语法错误;或者用本地的JSON校验工具检查格式是否合规
2. 核对目标类的属性与JSON字段完全匹配
这是最常见的问题点,要保证你的实体类和JSON字段名称、类型完全对应:
- 名称大小写:比如JSON里是
Name,你的类里不能写成name(默认情况下多数反序列化库是大小写敏感的,比如Newtonsoft.Json) - 类型匹配:
StartDate是ISO格式的字符串,类里对应的属性应该是DateTime或DateTime?(可空类型避免空值报错)Zips是逗号分隔的字符串(比如你片段里的" 1193,31192..."),类里要定义成string类型,要是写成List<int>肯定会报错,因为JSON里这是单个字符串不是数组
举个符合你JSON片段的实体类示例:
public class Location { public string Name { get; set; } public string Area { get; set; } public string District { get; set; } public string Manager { get; set; } public string Email { get; set; } public string Phone { get; set; } public DateTime StartDate { get; set; } public string Zips { get; set; } }
3. 检查反序列化代码是否正确
确保你是把JSON数组反序列化为List<T>,而不是单个对象:
比如用Newtonsoft.Json的正确写法:
// 假设jsonString是你的完整JSON字符串 var locations = JsonConvert.DeserializeObject<List<Location>>(jsonString);
要是不小心写成JsonConvert.DeserializeObject<Location>(jsonString)(漏掉了List<>),就会报你遇到的错误——因为JSON是数组,但你试图反序列化为单个对象。
4. 排查JSON中的特殊字符
有时候JSON里可能包含不可见的特殊字符(比如全角空格、隐藏的换行符),导致反序列化失败。你可以把JSON粘贴到Notepad++这类编辑器里,开启「显示所有字符」的功能,检查有没有异常字符。
5. 开启详细错误日志定位问题
如果上面的步骤都没解决,可以让反序列化库输出更详细的错误信息,比如用Newtonsoft.Json的错误处理:
var settings = new JsonSerializerSettings { Error = (sender, args) => { Console.WriteLine($"反序列化错误详情:{args.ErrorContext.Error.Message},出错字段:{args.ErrorContext.Member}"); args.ErrorContext.Handled = true; // 避免程序崩溃,先记录错误 } }; var locations = JsonConvert.DeserializeObject<List<Location>>(jsonString, settings);
这样能精准定位到是哪个字段或者哪个数组元素出了问题,方便快速修复。
内容的提问来源于stack exchange,提问作者NoBullMan
相关产品推荐
相关产品推荐

