23

我有 JavaScript 对象说:

var a = {b: Infinity, c: 10};

当我做

var b = JSON.stringify(a);

它返回以下内容

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

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

我该如何解决这个问题。

4

3 回答 3

14

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

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

var c = JSON.parse(
          b,
          function (key, value) {
            return value === "Infinity"  ? Infinity : value;
          }
        );
于 2013-05-20T07:38:37.670 回答
7

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 }
}

这个结构是由生成的,假设你上面的例子做了你所说的,

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);
于 2013-05-20T07:33:02.350 回答