Javascript 强制JSON.stringify()发出NaN/Infinity或JSON-lib
我正在研究向使用JSONRPC进行客户机/服务器交互的现有科学应用程序添加NaN/Infinity支持的可行性。许多JSON库确实处理(在某些情况下可选)NAN和INF,例如: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,这个问题还没
- Python读写
- Java读写字符串而不是空字
- Java读写
- Javascript可以
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。
因为,例如,字符串无穷大现在有两种可能的含义-字符串无穷大和无穷大的数字表示,接收者无法知道选择哪种含义。我无法提供代表所有可能发生的情况的示例数据——它实际上可以是任何对象。