C# JSON反序列化异常排查:代码还是JSON文件问题?
C# JSON反序列化异常排查方案
- 先提取异常核心细节:反序列化报错时,错误信息会明确指出问题位置(比如
Path 'xxx', line y, position z)和具体原因(类型不匹配、JSON语法错误等),优先看这个,能直接定位排查方向。 - 验证JSON格式合法性:把你的JSON内容复制到JSON校验工具(比如VS自带的JSON编辑器、本地编写的校验脚本),检查是否存在语法错误:
- 所有字符串必须用双引号包裹,单引号不符合JSON规范
- 数组、对象末尾不能有多余的逗号
- 特殊字符(如引号、换行)必须正确转义(用
\前缀) - 数值不能有非法格式(比如前导零、多个小数点)
- 比对数据类与JSON结构:
- 检查类的属性名和JSON的键是否完全匹配(C#默认大小写敏感,除非用
[JsonProperty("json_key_name")](Newtonsoft)或[JsonPropertyName("json_key_name")](System.Text.Json)指定映射关系) - 确认属性类型一致:比如JSON里是数字类型,类里不能定义为string;JSON里是数组,类里不能定义为单个对象;JSON可能出现null值的字段,类里要设为可空类型(比如
int?而非int) - 嵌套结构要完全对应:JSON里的嵌套对象,类里必须有对应的嵌套类,层级不能出错
- 如果你用
{"playlistList":[]}封装JSON,根数据类必须包含名为playlistList的属性,类型为对应列表类型,反序列化时要以这个根类为目标,示例代码:// 根类 public class PlaylistRoot { public List<PlaylistItem> playlistList { get; set; } } // 子项类 public class PlaylistItem { // 对应JSON子项的属性,示例: public string Name { get; set; } public int TrackCount { get; set; } } // 反序列化代码 var result = JsonConvert.DeserializeObject<PlaylistRoot>(jsonContent);
- 检查类的属性名和JSON的键是否完全匹配(C#默认大小写敏感,除非用
- 测试最小化案例:
- 从JSON中截取单个完整的对象,写最简的数据类尝试反序列化,确认单个对象能正常解析
- 单个对象没问题后,再测试列表形式,逐步定位是否是某条数据的特殊字段导致报错
- 检查序列化库配置:
- 用Newtonsoft.Json时,若JSON键是驼峰、类属性是大驼峰,可通过
JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }适配 - 用System.Text.Json时,默认大小写敏感,可添加
JsonSerializerOptions { PropertyNameCaseInsensitive = true }来忽略大小写差异
- 用Newtonsoft.Json时,若JSON键是驼峰、类属性是大驼峰,可通过
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

