JSON.stringify converting Infinity to null

2019-01-11 23:50发布

问题:

I have JavaScript Object say:

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

When I do

var b = JSON.stringify(a);

it returns the following

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

How is the JSON.stringify converts the object to strings?

I tried MDN Solution.

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

But in this case I have to return the string "Infinity" not Infinity. If I return Infinity it again converts Infinity to null.

How do I solve this problem.

回答1:

Like the other answers stated, Infintity is not part of the values JSON can store as value.

You can reverse the censor method on parsing the JSON:

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


回答2:

JSON doesn't have Infinity or NaN, see this question:

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

Hence { b: Infinity, c: 10 } isn't valid JSON. If you need to encode infinity in JSON, you probably have to resort to objects:

{
    "b": { "is_infinity": true, "value": null },
    "c": { "is_infinity": false, "value": 10 }
}

This structure is generated by, given your above example does what you say it does,

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


回答3:

JSON doesn't support infinity/Nan.

Please refer the below links.

http://www.markhansen.co.nz/inspecting-with-json-stringify/

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/stringify

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

Thanks,

Siva