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 ..."十六进制形式.)