WEB .NET 5 Newtonsoft 中的序列化 - 最后 2 位数字反序列化不正确

分享于2022年07月17日 .net asp.net-core c# json swagger-ui 问答
【问题标题】:WEB .NET 5 Newtonsoft 中的序列化 - 最后 2 位数字反序列化不正确(Serialization in WEB .NET 5 Newtonsoft - last 2 digits deserialize incorrectly)
【发布时间】:2022-01-26 10:00:44
【问题描述】:

我有一个小型 API,其中 POST 请求,但 List 中的一个字段被错误地反序列化。

我正在上课:

用于向 API 发送一些数据的类(只是长型客户端应用程序的 ID 列表):

public class PostDTO 
{
  public List Ids { get; set; }
}

API 项目中另一个在服务器上运行的类:

public class RequestDTO
{
  public List Ids { get; set; }
}

现在是控制器中的主要方法:

[HttpPost("v2/{testNumber}")]public async Task PostV2(int someNumber, [FromBody] PostDTO receivedData)

{
    
}

我正在使用 Swagger UI 测试这个东西。当我在列表中发布带有一些 ID 的 JSON 时:

"Ids":{
        "$id": "2",
        "$values": [
            212701000000005615
        ]
    }

receivedData 的数字在右侧用零填充:

Example input:  212701000000005615
Example output: 212701000000005600

我已将此添加到 Swagger 配置中:

services.AddControllers().AddNewtonsoftJson(x=> { x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; x.SerializerSettings.FloatParseHandling = Newtonsoft.Json.FloatParseHandling.Double; });

得到了 nugets - Newtonsoft.JSON 和 Microsoft.AspNetCore.Mvc.NewtonsoftJson。

为什么最后会反序列化成那些 00?我在两边都试过十进制/双精度/浮点数,但它不起作用。但是,如果我在客户端使用字符串,它会以某种方式起作用。我可以做些什么来实现对代码的最小更改并使其正常工作?

  • 无法 reproduce 使用 Newtonsoft 本身的错误。
  • 这可能是一件大摇大摆的事情。但是当我将输入列表的类型更改为字符串时,它工作正常。
  • 看起来,当它从 swagger 网站发布时,它会导致问题,当从移动应用程序运行时,它工作正常。

【解决方案1】:

Swagger UI 使用 JavaScript 发送请求,而这些数字超出了 JavaScript 的数字范围,这就是它们被四舍五入的原因。有关详细信息,请参阅:

您仍然可以使用其他客户端测试请求,例如 curl 。或者您特别需要 Swagger UI,一种可能的解决方法是将 Ids 的类型从 List<long> 更改为 List<string>

  • 有趣。谢谢你的回答,没想到会是这样。我不是 JS 程序员,swagger 只是用来测试不同的 API 调用。有趣的是,它适用于另一个客户端。谢谢你的回答