提问人:malat 提问时间:11/10/2023 最后编辑:malat 更新时间:11/10/2023 访问量:50
JSON 生态系统中 Infinity、-Infinity 和 NaN 的互操作性?
Interoperability of Infinity, -Infinity and NaN in JSON ecosystem?
问:
我试图了解JSON世界中是否存在某种可移植性(StringNumericLiteral)。我知道没有在JSON中指定,我只是想在不同语言之间找到一个共同点。Infinity, -Infinity, NaN
Infinity, -Infinity, NaN
最后,它应该与 JavaScript 兼容。
答:
0赞
malat
11/10/2023
#1
根据一些实验(谷歌浏览器中的 F12),我看到这些特殊值的扩展名是这样的:Number
> Number("-Infinity")
-Infinity
而:
> Number("-Inf")
NaN
我看到了某种互操作性的两个候选者:
[NaN, Infinity, -Infinity]
或["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 时应该集中精力而不是关注。Number
Number
NaN
Number("false")
false
NaN
JSON.parse
Number
评论
JsonNode
"Infinity"
double
d = JsonNode.Parse("\"Infinity\"").Deserialize<double>(new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals });
AllowNamedFloatingPointLiterals
JSON.parse