我试图了解 JSON 世界中是否存在某种
Infinity, -Infinity, NaN
的可移植性(StringNumericLiteral)。我知道 [JSON][2] 中没有指定 Infinity, -Infinity, NaN
,我只是想找到不同语言之间的共同点。
最终它应该兼容JavaScript。
根据一些实验(谷歌浏览器中的 F12),我看到那些特殊
Number
值的扩展如下:
> Number("-Infinity")
-Infinity
同时:
> Number("-Inf")
NaN
我看到了某种互操作性的两个候选者:
[NaN, Infinity, -Infinity]
或["NaN", "Infinity", "-Infinity"]
现在如果我需要在不同的语言/框架之间处理这个 JSON 文件。这是我今天观察到的(目标是生成的 JSON 在处理时不会触发异常):
语言 | 无引号 | 带引号 |
---|---|---|
Node.js | ❌不支持 | ✅ 支持,感谢数字强制 |
python3 | ✅ 支持(allow_nan=True) | ❌不支持 |
System.Text.Json.JsonSerializer | ❌不支持 | ✅ 支持(AllowNamedFloatingPointLiterals) |
System.Text.Json.JsonNode | ❌不支持 | ❌不支持 |
Json.NET | ✅支持 | ✅ 支持(来自用户 dbc 的贡献) |
我怀疑我们可以添加更多内容。但结论是 NaN、Infinity、-Infinity 的 JSON 扩展根据所使用的框架是不兼容的。
因此,截至目前,执行这些特殊值的唯一可移植方法是使用这些值进行字符串表示:
["NaN", "Infinity", "-Infinity"]
"NaN"
将是一个特殊的字符串,需要特别小心,因为任何无效字符串在 ECMAScript 中都会返回 NaN
。