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

ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题

Asp Core 3.1 API JsonIgnore (not) 在反序列化中被忽略