覆盖Json反序列化一个前导零作为小数而不是八进制值的数字

Nar*_*ren 3 c# serialization json json.net deserialization

我正在生成一个json对象,

{
   "number":0100
}
Run Code Online (Sandbox Code Playgroud)

当使用Newtonsoft.Json在C#中反序列化此对象时,由于前导零,0100被视为八进制数.有没有办法覆盖此功能并使其将数字视为十进制整数?

Ste*_*n C 11

如果Newtonsoft.Json这样做,那就是一个bug.根据http://json.org上记录的JSON语法:

" 除非不使用八进制和十六进制格式,否则数字非常类似于C或Java编号."

并且语法图不允许数字具有前导非重要零.

RFC 4627第2.4节.同意:

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

事实上,根据RFC,你对前导零的使用根本不是有效的JSON.


那么,回答你的问题:

有没有办法覆盖此功能并使其将数字视为十进制整数?

可能不是.而且,你不应该这样做.相反,你应该修复JSON,或者向生成它的人抱怨它不符合要求.

您还应该将此报告为Newtonsoft.Json中的错误..不要打扰.作者不承认这是一个错误.我建议切换到正确实现JSON规范的JSON库.


JSON IMPLEMENTERS的建议

JSON规范(两个版本)明确指出不允许使用十六进制和八进制形式.

如果向JSON解析器添加对十六进制和/或八进制(或其他非正式"扩展")的支持,则会添加JSON标准的碎片.这是不好的.

这也是一个坏主意,因为当非重要前导零被视为八进制标记时,许多最终用户会感到惊讶.这导致像这样的问题...其中(我猜)OP的最终用户已被烧毁,并要求他修复>>他的<<代码以正确处理前导零".

这里的正确行为是严格实现JSON规范,并拒绝具有非重要前导零的任何数字.(就个人而言,我会为此实现特殊情况错误消息以及"0x ..."十六进制形式.)

  • Newtonsoft.Json 的这个特性实际上非常危险。越来越多的配置被存储为 json 文件并手动编辑。如果用户不自觉地添加前导零(并且偶然不会使用数字 8 和 9),他将不知道他的数字不再是小数。 (2认同)