【问题标题】:JSON.stringify converting Infinity to nullJSON.stringify 将 Infinity 转换为 null
【发布时间】:2013-05-14 17:17:33
【问题描述】:

我有 JavaScript 对象说:

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

当我这样做时

var b = JSON.stringify(a);

它返回以下内容

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

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

我试过MDN Solution

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

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

我该如何解决这个问题。

【问题讨论】:

  • 也许对于某些用例,使用另一个低或高的数字就可以了:Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER

标签: javascript json infinity stringify


【解决方案1】:

JSON 没有 Infinity 或 NaN,请参阅此问题:

JSON left out Infinity and NaN; JSON status in ECMAScript?

因此 { 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);

【讨论】:

    【解决方案2】:
    【解决方案3】:

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

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

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

    【讨论】:

    • 我总是可以做到这一点,但最好获得 Infinity 而不是“Infinity”,因为我不需要对具有数百个属性的数百个对象执行此额外检查。
    • 正如我在回答中所写,包含 Infinity(不带引号)作为值的 JSON 文件将不是有效的 JSON。您不应该编写不符合标准的 JSON 文件。
    • @DigvijayYadav,我担心你将不得不忍受野兽的本性。
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2018-07-06
    • 2021-09-13
    • 2016-01-22
    相关资源
    最近更新 更多