强制 JSON.stringify() 发出 NaN / Infinity 或这样做的 JS JSON 库

elh*_*efe 5 javascript json nan infinity

我正在研究将 NaN/Infinity 支持添加到使用 JSONRPC 进行客户端/服务器交互的现有科学应用程序的可行性。许多 JSON 库确实处理(在某些情况下可选)NaN 和 Infs,例如:

  • Python json读写
  • Java Jackson读取但写入字符串而不是裸字
  • Java GSON读写
  • Javascript 可以读取

我知道JSON 规范不支持 NaN 和 Infinity ,并且知道相关 问题。但是,AFAICT 是否有某种方法可以强制本机 JSJSON.stringify()方法发出 NaN/Infinity,或者是否有一个 JS JSON 库可以执行相同操作的问题尚未得到解答。与参考问题的细微差别,也许,但很重要。到目前为止,我一直无法发现这样的方法或库,所以我在这里。编写自己的 JSON 序列化程序是唯一的选择吗?

请注意,replacement参数 ofJSON.stringify()没有帮助,至少在我手中。

更新:将NaN/Infinity 等作为字符串发出会使这些字符串的语义不明确。它们需要像在 Python 和 GSON 实现中一样作为裸字发出。

Xot*_*750 6

这是一个例子

JavaScript

var array1 = [-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity],
    json = JSON.stringify(array1, function (key, value) {
        if (value !== value) {
            return 'NaN';
        }

        if (value === Infinity) {
            return 'Infinity';
        }

        if (value === -Infinity) {
            return '-Infinity';
        }

        return value;
    }),
    array2 = JSON.parse(json, function (key, value) {
        if (value === 'NaN') {
            return NaN;
        }

        if (value === 'Infinity') {
            return Infinity;
        }

        if (value === '-Infinity') {
            return -Infinity;
        }

        return value;
    });

console.log(json);
console.log(array2);
Run Code Online (Sandbox Code Playgroud)

输出

["-Infinity",-1,0,1,2,"NaN",4,5,"Infinity"]
[-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity]
Run Code Online (Sandbox Code Playgroud)

参考

JSON.stringify

JSON解析

关于jsFiddle

更新:

JavaScript

var array1 = [-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity],
    json = JSON.stringify(array1, function (key, value) {
        if (value !== value) {
            return '0/0';
        }

        if (value === 1/0) {
            return '1/0';
        }

        if (value === -1/0) {
            return '-1/0';
        }

        return value;
    }),
    array2 = JSON.parse(json, function (key, value) {
        if (value === '0/0') {
            return 0/0;
        }

        if (value === '1/0') {
            return Infinity;
        }

        if (value === '-1/0') {
            return -1/0;
        }

        return value;
    });

console.log(json);
console.log(array2);
Run Code Online (Sandbox Code Playgroud)

输出

["-1/0",-1,0,1,2,"0/0",4,5,"1/0"]
[-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity] 
Run Code Online (Sandbox Code Playgroud)

关于jsFiddle

  • 请参阅上面的更新 - 您使用的字符串的语义现在不明确。 (2认同)