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
相关产品推荐
相关产品推荐

