C#使用JsonConvert反序列化JSON数组时实体属性全为null的问题
Newtonsoft.Json 反序列化后属性全为null的原因与解决方案
问题根因
反序列化失败的核心是JSON键名与C#类属性名存在不匹配的空格差异:
- 目标JSON数组内的两个对象字段,键名是带尾随空格的:
"Name "、"Abbreviation "(键字符串末尾多了一个不可见的空格字符) - 定义的
AbbriviationKey类属性为无多余空格的标准命名:Name、Abbreviation
Newtonsoft.Json(即JsonConvert依赖的序列化组件)默认的键匹配规则为:允许自动兼容键名的大小写差异,但不会主动忽略键名中夹杂的额外空格、标点等非字母数字差异。当序列化器无法找到和类属性规则匹配的JSON键时,就不会触发属性赋值逻辑,类实例的字符串属性会保持默认值null,最终出现所有属性都为null的现象。
对应解决方法
方案1:修正JSON源文件格式
直接移除JSON键名末尾的多余空格,将键名修改为和类属性完全对应的"Name"、"Abbreviation"。这种方式没有额外配置开销,是最推荐的处理路径,适合可以自由编辑JSON文件的场景。方案2:通过特性显式指定键名映射
如果JSON文件由第三方系统生成、无法随意修改,可以在AbbriviationKey类的属性上添加JsonProperty特性,显式绑定需要匹配的带空格的JSON键名,绕开默认的键名匹配逻辑,示例代码:public class AbbriviationKey { // 显式关联带尾随空格的JSON键 [JsonProperty("Name ")] public string Name { get; set; } [JsonProperty("Abbreviation ")] public string Abbreviation { get; set; } }修改类定义后,原有反序列化代码无需调整即可正常获取属性值。
方案3:自定义全局契约解析器兼容空格键
如果项目中存在大量带尾随空格的不规范JSON键、无法逐个修改源文件或添加特性标注,可以自定义继承自DefaultContractResolver的契约解析器,在键名匹配阶段自动对JSON键做前后空格trim操作,实现全局兼容。这种方式属于全局侵入式配置,容易引发其他业务场景下的键名匹配异常,仅在JSON格式完全无规范的特殊场景下使用。
内容的提问来源于stack exchange,提问作者Safi Habhab
相关产品推荐
相关产品推荐

