Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 强制JSON.stringify()发出NaN/Infinity或JSON-lib_Javascript_Json_Nan_Infinity - Fatal编程技术网

Javascript 强制JSON.stringify()发出NaN/Infinity或JSON-lib

Javascript 强制JSON.stringify()发出NaN/Infinity或JSON-lib,javascript,json,nan,infinity,Javascript,Json,Nan,Infinity,我正在研究向使用JSONRPC进行客户机/服务器交互的现有科学应用程序添加NaN/Infinity支持的可行性。许多JSON库确实处理(在某些情况下可选)NAN和INF,例如: Python读写 Java读写字符串而不是空字 Java读写 Javascript可以 我知道NaN和Infinity在中不受支持,并且我知道。然而,关于是否有某种方法强制本机JSJSON.stringify()方法发出NaN/Infinity,或者是否有一个JS JSON库发出NaN/Infinity,这个问题还没

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

  • Python读写
  • Java读写字符串而不是空字
  • Java读写
  • Javascript可以
我知道NaN和Infinity在中不受支持,并且我知道。然而,关于是否有某种方法强制本机JS
JSON.stringify()
方法发出NaN/Infinity,或者是否有一个JS JSON库发出NaN/Infinity,这个问题还没有答案。可能与参考问题有细微的区别,但很重要。到目前为止,我还无法发现这样的方法或库,所以我就在这里。编写自己的JSON序列化程序是唯一的选择吗

请注意,
JSON.stringify()
replacement
参数没有帮助,至少在我手中是这样

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

下面是一个示例

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);
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);
输出

["-Infinity",-1,0,1,2,"NaN",4,5,"Infinity"]
[-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity]
["-1/0",-1,0,1,2,"0/0",4,5,"1/0"]
[-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity] 
参考资料

更新:

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);
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);
输出

["-Infinity",-1,0,1,2,"NaN",4,5,"Infinity"]
[-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity]
["-1/0",-1,0,1,2,"0/0",4,5,"1/0"]
[-Infinity, -1, 0, 1, 2, NaN, 4, 5, Infinity] 

关于

替换
JSON的参数。stringify是非常适合这项工作的工具

JSON.stringify(data, function(key, value) {
   if (value === Infinity) {
      return "Infinity";
   } else if (value === -Infinity) {
      return "-Infinity";
   } else if (value !== value) {
      return "NaN";
   }
   return value;
});
另一方面,您可以使用
JSON.parse的
reviver
参数

 JSON.parse(data, function(key, value) {
   if (value === "Infinity") {
      return Infinity;
   } else if (value === "-Infinity") {
      return -Infinity;
   } else if (value === "NaN") {
      return NaN;
   }
   return value;
});

这正是一项
更换参数的工作,并不难。也许您可以详细说明您的实际问题,以及一个示例和示例数据?JSON.stringify({a:1,b:1/“gg”,c:{d:5}),函数(a,b,c){if(Object.is(NaN,b)){return“NaN”;}return b;})@dandavis请参阅上面的更新。如果您打算对问题进行否决表决,至少解释一下它有什么问题,这样我就可以修复它了。你可以用guid代替,例如:“NaN”如果您担心字符串冲突并希望使用快速本机解析器,则无需在
返回后使用
else
s查看上面的更新-此处的解决方案在您选择表示NaN&Inf的字符串的语义中引入了歧义。@Xotic750我更喜欢
else if
,因为它使代码更短,并且在这种情况下不会影响功能。但感谢您的注意。@elhefe我同意,它们现在是模棱两可的,使用现有的本机实现我们无能为力。我明白了,你们找到了解决方案,对JSON2库进行黑客攻击。GLSee update以上-您使用的字符串的语义现在是模糊的。它们是怎样的?您还没有向我们提供任何示例a数据。我使用的例子只是数字。因此,此上下文中的这些字符串表示形式并不含糊,它们只表示那些特定的值。如果您想要一个不符合规范的库,我建议您获取代码的副本并修改代码以满足您的需要。或者,如果您担心的是字符串表示形式,并且需要一个替代方案,那么请尝试
如果您计算1/0,则得到无穷大;如果您计算-1/0,则得到无穷大;如果您计算0/0,则得到NaN。
因为,例如,字符串无穷大现在有两种可能的含义-字符串无穷大和无穷大的数字表示,接收者无法知道选择哪种含义。我无法提供代表所有可能发生的情况的示例数据——它实际上可以是任何对象。