You need to enable JavaScript to run this app. ASP.NET Core 5中字段无法反序列化JSON但属性可以,是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 5中字段无法反序列化JSON但属性可以,是什么原因?

问题原因

该行为不是.NET 5的新增改动,是ASP.NET Core默认JSON序列化器System.Text.Json的默认规则:
从.NET Core 3.0开始,ASP.NET Core默认将内置JSON序列化器从Newtonsoft.Json替换为System.Text.Json,System.Text.Json默认仅支持对公共属性进行序列化/反序列化,会忽略所有公共字段。
你在.NET Core 3.1中未遇到该问题,大概率是当时项目手动引入了Newtonsoft.Json作为默认序列化器(比如启动配置中调用了AddNewtonsoftJson()方法),Newtonsoft.Json默认支持公共字段的序列化/反序列化。

解决方案

你可以根据项目需求选择任意一种方案解决:

  • 方案一:保持使用默认System.Text.Json,给需要参与序列化的公共字段添加[JsonInclude]特性
    using System.Text.Json.Serialization;
    namespace Service
    {
        public class ServiceInput
        {
            [JsonInclude]
            public string Sentence;
            [JsonInclude]
            public int Foo;
        }
    }
    
  • 方案二:全局配置System.Text.Json支持序列化公共字段,修改启动类的服务注册逻辑:
    services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.IncludeFields = true;
        });
    
  • 方案三:换回Newtonsoft.Json作为默认序列化器,先安装Microsoft.AspNetCore.Mvc.NewtonsoftJsonNuGet包,再修改服务注册逻辑:
    services.AddControllers()
        .AddNewtonsoftJson();
    
  • 方案四:将类中的字段改为属性,也就是你已经验证过可以正常工作的方案,这也是符合.NET类型设计规范的推荐写法。

内容的提问来源于stack exchange,提问作者Grimson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 15:45:09