JSON.stringify将Infinity转换为null

me_*_*jay 15 javascript json infinity stringify

我有JavaScript对象说:

var a = {b: Infinity, c: 10};
Run Code Online (Sandbox Code Playgroud)

当我做

var b = JSON.stringify(a);
Run Code Online (Sandbox Code Playgroud)

它返回以下内容

b ="{"b":null,"c":10}";

JSON.stringify如何将对象转换为字符串?

我尝试过MDN解决方案.

function censor(key, value) {
  if (value == Infinity) {
    return "Infinity";
  }
  return value;
}
var b = JSON.stringify(a, censor);
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我必须返回字符串"Infinity" Infinity.如果我返回Infinity,它会再次将Infinity转换为null.

我该如何解决这个问题.

Koo*_*Inc 11

与所述的其他答案一样,Infintity不是JSON可以存储为值的值的一部分.

您可以在解析JSON时反转censor方法:

var c = JSON.parse(
          b,
          function (key, value) {
            return value === "Infinity"  ? Infinity : value;
          }
        );
Run Code Online (Sandbox Code Playgroud)

  • 正如我在回答中所写,包含“Infinity”(不带引号)作为值的 JSON 文件将不是有效的 JSON。您不应该编写不符合标准的 JSON 文件。 (3认同)

Joh*_*hnB 6

JSON没有Infinity或NaN,请看这个问题:

JSON遗漏了Infinity和NaN; ECMAScript中的JSON状态?

因此{ b: Infinity, c: 10 }是无效的JSON.如果需要在JSON中编码无穷大,则可能需要求助于对象:

{
    "b": { "is_infinity": true, "value": null },
    "c": { "is_infinity": false, "value": 10 }
}
Run Code Online (Sandbox Code Playgroud)

这个结构是由上面的例子做的,你说它做了什么,

function censor(key, value) {
  if (value == Infinity) {
    return JSON.stringify ( { is_infinity: true, value: null } );
  } else {
    return JSON.stringify ( { is_infinity: false, value: value } );
  }
}
var b = JSON.stringify(a, censor);
Run Code Online (Sandbox Code Playgroud)