JSON 生态系统中 Infinity、-Infinity 和 NaN 的互操作性?

Interoperability of Infinity, -Infinity and NaN in JSON ecosystem?

提问人:malat 提问时间:11/10/2023 最后编辑:malat 更新时间:11/10/2023 访问量:50

问:

我试图了解JSON世界中是否存在某种可移植性(StringNumericLiteral)。我知道没有在JSON中指定,我只是想在不同语言之间找到一个共同点。Infinity, -Infinity, NaNInfinity, -Infinity, NaN

最后,它应该与 JavaScript 兼容。

JSON 互操作 IEEE-754

评论

0赞 dbc 11/10/2023
在 C# 中,广泛使用的 Json.NET 库支持这两种样式,请参阅 FloatFormatHandling 枚举
0赞 dbc 11/10/2023
顺便说一句,可以解析带引号的命名数字文字,例如,它不会自动将它们识别为双精度。但是您随后可以将一个反序列化为 a,它将起作用,例如 作品,见 dotnetfiddle.net/7FHCHNJsonNode"Infinity"doubled = JsonNode.Parse("\"Infinity\"").Deserialize<double>(new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals });
0赞 trincot 11/10/2023
您提供的指向 ECMAScript 规范的链接与 JSON 无关。
0赞 malat 11/10/2023
令人困惑的不是我的问题。事实上,M$ 仅针对基于字符串实现。无论如何,ECMAScript 都是 JSON 的头号消费者,因此互操作性需要考虑这个特定的规范。AllowNamedFloatingPointLiterals
0赞 trincot 11/10/2023
问题是什么?将 NaN 编码为“NaN”的问题在于 (1) 现在您无法再对字符串“NaN”进行编码,(2) 消费者必须意识到这种与 JSON 的偏差。将 NaN 编码为 NaN 令牌(违反 JSON)的问题在于,客户端经常会因此类语法冲突而绊倒,就像在 ECMAScript 中抛出的那样。JSON.parse

答:

0赞 malat 11/10/2023 #1

根据一些实验(谷歌浏览器中的 F12),我看到这些特殊值的扩展名是这样的:Number

> Number("-Infinity")
-Infinity

而:

> Number("-Inf")
NaN

我看到了某种互操作性的两个候选者:

  1. [NaN, Infinity, -Infinity]
  2. ["NaN", "Infinity", "-Infinity"]

现在,如果我需要在不同的语言/框架之间处理这个JSON文件。这是我今天观察到的(目标是生成的 JSON 在处理时不会触发异常):

语言 无引号 带引号
节点.js 不支持 ✅ 支持,这要归功于数字强制
蟒蛇3 支持allow_nan=True) ❌ 不支持
System.Text.Json.JsonSerializer ❌ 不支持 支持 (AllowNamedFloatingPointLiterals)
System.Text.Json.JsonNode 不支持 ❌ 不支持
Json.NET 支持 ✅ 支持(来自用户 dbc 的 contrib)

我怀疑我们可以再添加一些。但结论是,根据所使用的框架,NaN、Infinity 和 -Infinity 的 JSON 扩展是不兼容的。

因此,截至今天,执行这些特殊值的唯一可移植方法是作为具有这些值的字符串表示:

["NaN", "Infinity", "-Infinity"]

"NaN"将是一个特殊的字符串,需要特别小心,因为任何无效的字符串都会在 ECMAScript 中返回。NaN

评论

0赞 trincot 11/10/2023
在 ECMAScript 中引用似乎无关紧要。该函数无法解析 JSON,也不用于此。你说“任何无效的字符串在 ECMAScript 中返回 NaN(当我认为你指的是该函数时),但不仅如此:它还将返回一些有效的 JSON。例如,不是 ,而是 。我真的认为你在这里混淆了东西,在查看 ECMAScript 时应该集中精力而不是关注。NumberNumberNaNNumber("false")falseNaNJSON.parseNumber