Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON.stringify converting Infinity to null

Tags:

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.

like image 719
me_digvijay Avatar asked May 20 '13 07:05

me_digvijay


People also ask

What causes JSON Stringify failure?

JSON. stringify() throws an error when it detects a cyclical object. In other words, if an object obj has a property whose value is obj , JSON. stringify() will throw an error.

How do you pass Infinity in JSON?

There is no way to represent Infinity or NaN in JSON. There is a very strict syntax for numbers, and Infinity or NaN is not part of it.

Does JSON Stringify remove undefined?

JSON. stringify will omit all object attributes that are undefined .

What is reverse of JSON Stringify?

JSON. parse is the opposite of JSON. stringify .


2 Answers

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;           }         ); 
like image 77
KooiInc Avatar answered Sep 19 '22 13:09

KooiInc


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); 
like image 20
JohnB Avatar answered Sep 16 '22 13:09

JohnB