c# - 覆盖 Json 反序列化带有前导零的数字作为十进制而不是八进制值

标签 c# json serialization json.net deserialization

我正在生成一个 json 对象,

{
   "number":0100
}

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

最佳答案

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

"A number is very much like a C or Java number, except that the octal and hexadecimal formats are not used."

并且语法图不允许数字有一个前导的无意义零。

RFC 4627第 2.4 节。同意:

"Octal and hex forms are not allowed. Leading zeros are not allowed."

所以实际上,根据 RFC,您对前导零的使用根本不是有效的 JSON ...。


所以,回答你的问题:

Is there a way to override this functionality and make it consider the number as a decimal integer?

可能不会。此外,您不应该这样做。相反,您应该修复 JSON,或者向生成它的人提示它不符合标准。

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


给 JSON 实现者的建议

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

如果您将对十六进制和/或八进制(或其他一些非官方“扩展”)的支持添加到您的 JSON 解析器,那么您将添加到 JSON 标准的碎片中。这很糟糕。

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

此处的正确行为是严格实现 JSON 规范,并拒绝任何带有不重要前导零的数字。 (就个人而言,我会为此和“0x...”十六进制形式实现特殊情况的错误消息。)

关于c# - 覆盖 Json 反序列化带有前导零的数字作为十进制而不是八进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29048110/

相关文章:

c# - 如何在 operator== 方法中检查 null?

json - 是否有用于 Camunda Rest 响应的 Java 类?

xml - 如何将 Moose 对象序列化为 XML?

c# - 无法从程序集 `A` 加载类型 `Not.Containing.Type.A`

c# - 有关C#中IEnumerator.GetEnumerator的问题

java - 没有数组字符串如何解析JSON数据?

java - 对象流 : is there a way to read serialized object as properties map?

java - 为什么此序列化逻辑失败并显示 'unmatched serializable field(s) declared' ?

c# - HttpClient 正在添加它自己的 cookie header

c# - 遍历包含多个 ExpandoObject 的 ExpandoObject