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

问题描述 投票:0回答:1

我试图了解 JSON 世界中是否存在某种

Infinity, -Infinity, NaN
的可移植性(StringNumericLiteral)。我知道 [JSON][2] 中没有指定
Infinity, -Infinity, NaN
,我只是想找到不同语言之间的共同点。

最终它应该兼容JavaScript。

json interop ieee-754
1个回答
0
投票

根据一些实验(谷歌浏览器中的 F12),我看到那些特殊

Number
值的扩展如下:

> Number("-Infinity")
-Infinity

同时:

> Number("-Inf")
NaN

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

  1. [NaN, Infinity, -Infinity]
  2. ["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

© www.soinside.com 2019 - 2024. All rights reserved.