【发布时间】: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