【问题标题】:C# ASP.NET WebApi (2/Core 3.1) Problem with Json serialization of big numbersC# ASP.NET WebApi (2/Core 3.1) 大数字的 Json 序列化问题
【发布时间】:2020-02-19 10:33:22
【问题描述】:

我有一个问题,大数字(Int64/UInt64)被 ASP.NET Json 序列化四舍五入。 这发生在 ASP.NET WebApi2 (.NET 4.5.2) 以及 ASP.NET Core WebApi (Core 3.1) 中。

这是我的 DTO 类:

public class TestDTO
{
    public IEnumerable<long> BigNumbers { get; set; }
}

这是我的控制器方法:

[HttpGet]
public IHttpActionResult GetNumberTest()
{
    TestDTO dto = new TestDTO
    {
        BigNumbers = new long[]
        {
            121720000000004554,
            21720000000004554,
            1720000000004554,
            720000000004554,
        }
    };

    return Ok(dto);
}

结果如下:

{
  "bigNumbers": [
    121720000000004560,
    21720000000004550,
    1720000000004554,
    720000000004554
  ]
}

如您所见,前两个数字已四舍五入(第一个向上舍入,第二个向下舍入),后两个未四舍五入。当然,这可能是致命的行为。如何禁用此行为?

奇怪的是......当我通过Newtonsoft.Json(JsonConvert.SerializeObject)手动序列化DTO时,结果是正确的。

我知道当我将数字序列化为字符串时它会起作用,但在我看来,这并不是解决问题的真正方法。我应该能够依赖我的 DTO 的正确序列化。

谁能帮帮我?

【问题讨论】:

  • 与json转换无关,与JavaScript有关。只需在 chrome 控制台中输入121720000000004554,您就会得到121720000000004560。您可以查看此链接以获取更多信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。 JavaScript 中有 BigInt 可用,但使用它可能会遇到很多问题。最简单和最安全的方法是依赖string

标签: c# asp.net json webapi


【解决方案1】:

事实证明,序列化的原始数据是正确的。只是 SwaggerUi / Firefox 通过 JavaScript 的可视化导致了这个问题。

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多