You need to enable JavaScript to run this app. C#使用JsonConvert反序列化JSON数组时实体属性全为null的问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 19:24:03