Asp Core 3.1 API JsonIgnore (not) 在反序列化中被忽略
Posted
技术标签:
【中文标题】Asp Core 3.1 API JsonIgnore (not) 在反序列化中被忽略【英文标题】:Asp Core 3.1 API JsonIgnore (not) ignored in deserialization 【发布时间】:2020-08-28 08:00:12 【问题描述】:我有这个设置
Asp 核心 3.1 API 在 API 和客户端之间发送的 MyClass 共享库 带有 Com 类的客户端应用程序在它们之间发送的MyClass
上,我有一个引用 com 类的字段 ComField
,这仅用于客户端应用程序,不应(反)序列化,因此我将其标记为 @ 987654323@
class MyClass
[JsonIgnore]
public ComThingy ComField
get// code here that throws the error when deserilaized on the API
set// code here
当我编写 API 来接受这样的类时,反序列化类时会出错。调试器在反序列化 MyClass 时,在进入方法之前抛出错误:
[HttpPost]
public async Task<ActionResult<MyClassReply>> Post([FromBody] MyClass myclass)
// code here
API 引发异常,访问 MyClass 上的 getter 会引发错误(因为 Com 的东西不在 API 上)。
如果我手动反序列化它可以正常工作,但是我的招摇并没有正确生成整个 API。
[HttpPost]
public async Task<ActionResult<MyClassReply>> Post()
// this works fine
var rdr = new StreamReader(Request.Body);
var mcj = await rdr.ReadToEndAsync();
var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<MyClass>(mcj);
// code here
所以我的问题是:为什么 ASP API 内置反序列化忽略了 JsonIgnore
属性并仍然尝试处理该属性(抛出错误),为什么手动反序列化按预期工作(即忽略该属性)?默认管道仍然使用 NewtonSoft 对吗?
如何使默认反序列化正常工作?
【问题讨论】:
【参考方案1】:从 ASP.NET Core 3.0 开始,默认的 JSON 序列化程序是 System.Text.Json
,而不是 Newtonsoft.Json
。您需要在您的Startup.cs
中调用.AddNewtonsoftJson()
才能使用它(例如参见this answer)。
您的问题可能只是因为您没有使用正确的JsonIgnore
属性。两个序列化器具有相同的命名属性:
System.Text.Json.Serialization.JsonIgnoreAttribute
Newtonsoft.Json.JsonIgnoreAttribute
也许您的 using 语句正在导入 Newtonsoft.Json
而不是 System.Text.Json
?
【讨论】:
以上是关于Asp Core 3.1 API JsonIgnore (not) 在反序列化中被忽略的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL
ASP.NET Core 3.1 和 Angular:将 api 调用重定向到登录页面
Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作
ASP.NET Core 3.1 / 5 WeatherForecast 示例 Web API 项目引发错误 404