Aspnet Mvc 十进制序列化错误



我有一个接受包含十进制属性的对象,如下所示的 post 方法

[HttpPost]
public async Task<IActionResult> Create(CreateDto createDto)
{
    ...do stuff here
}
public class CreateDto
{
    [Required]
    public string Id{ get; set; }
    [Required]
    public decimal? Rate{ get; set; }
}

当包含前导 0 的值传入 Rate 字段时,例如:0015,它总是以 10 的形式传入。

如果有人能解释这种现象,将不胜感激。

问题在于 aspnet core mvc JSON 解析器,它允许在 [0-7] 范围内的数字之前使用前导零,并将它们视为八进制,以匹配在 javascript 中使用 eval 获得的结果。

这种行为与 http://json.org 中所述的公会相矛盾:

"一个数字非常像一个C或Java数字,除了八进制 并且不使用十六进制格式。

并且语法图不允许数字具有前导非有效零。

RFC 4627 第 2.4 节同意:

"不允许使用

八进制和十六进制形式。不允许使用前导零。

简而言之,唯一的方法是使用正确实现 Json 规范的 JSON 解析器。

参考:重写 Json 反序列化前导零作为小数而不是八进制值的数字

最新更新