gpt4 book ai didi

c# - json 网络前导零(禁用基础转换)

转载 作者:行者123 更新时间:2023-11-30 15:21:29 28 4
gpt4 key购买 nike

Json.Net 无法正确反序列化带有前导零的数字。

例如 { "number":010 } 识别为 8(因为 010 在 8 base 中等于 8 在 10 base 中)

如果查看 JsonTextReader.ParseNumber() 你可以看到

long value2 = text2.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt64(text2, 16) : Convert.ToInt64(text2, 8);

如何禁用base-cast?也许可以替换 JsonTextReader

最佳答案

由于 JSON standard 不允许使用前导零, Newtonsoft 似乎决定将 JavaScript 风格的八进制数解析作为标准的扩展,参见 Json.NET 3.5 Release 7 – Biggest Release Ever Edition .此行为目前已硬编码到 JsonTextReader.ParseReadNumber(ReadType readType, char firstChar, int initialPosition) 中没有强制严格遵守标准的选项(即在前导零上抛出异常),如:

作为解决方法,您可以使用 JavaScriptSerializer解析为中间动态对象,然后将其重新序列化为中间 JToken,然后将该 JToken 反序列化为您的最终类:

var json = @"{ ""number"":010 }";

var root = JToken.FromObject(new JavaScriptSerializer().DeserializeObject(json)).ToObject<RootObject>();

if (root.Number != 10)
{
throw new InvalidOperationException();
}

使用

class RootObject
{
public int Number { get; set; }
}

您也可以重新序列化为中间 JSON 字符串,但重新序列化为中间 JToken 对于较大的对象应该更有效。

(如果您不需要 Json.NET 的全部功能,切换到 DataContractJsonSerializerJavaScriptSerializer 也是选项,因为它们都将默默地解析一个以 10 为基数的前导零整数。)

另一种选择是派生您自己的 JsonTextReader 版本和所有相关实用程序,并修复 JsonTextReader.ParseReadNumber() 的逻辑当 nonBase10 为真时抛出 JsonReaderException。不幸的是, fork 您自己的 JsonTextReader 可能需要大量的持续维护,因为您还需要 fork 阅读器使用的任何和所有 Newtonsoft 实用程序(有很多)并将它们更新为原始版本中的任何重大更改图书馆。您也可以在 enhancement request #646 上投票或发表评论请求严格的整数解析。

为什么 Newtonsoft 用八进制语法实现数字解析?我的猜测是他们添加了此功能来处理 JavaScript syntax for integer literals 格式的数字:

Integers

Integers can be expressed in decimal (base 10), hexadecimal (base 16), octal (base 8) and binary (base 2).

  • Decimal integer literal consists of a sequence of digits without a leading 0 (zero).
  • Leading 0 (zero) on an integer literal, or leading 0o (or 0O) indicates it is in octal. Octal integers can include only the digits 0-7.
  • Leading 0x (or 0X) indicates hexadecimal. Hexadecimal integers can include digits (0-9) and the letters a-f and A-F.

  • Leading 0b (or 0B) indicates binary. Binary integers can include digits only 0 and 1.

关于c# - json 网络前导零(禁用基础转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37561583/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com