2013-05-20 14 views
11

ho JavaScript Object dire:JSON.stringify conversione Infinity su null

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

Quando faccio

var b = JSON.stringify(a); 

esso restituisce il seguente

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

In che modo JSON.stringify converte l'oggetto in stringhe?

Ho provato MDN Solution.

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

Ma in questo caso devo restituire la stringa "Infinity" Non Infinity. Se restituisco Infinity, converte nuovamente Infinity in null.

Come risolvere questo problema.

risposta

9

Come le altre risposte indicate, Infintity non è parte dei valori JSON possibile memorizzare il valore.

È possibile invertire il metodo censore sulla analisi del JSON:

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

Questo posso sempre fare, ma sarebbe bello avere l'infinito non "Infinity", come non ho bisogno per eseguire questa controllo aggiuntivo sulle mie centinaia di oggetti con centinaia di proprietà. –

+0

Come ho scritto nella mia risposta, un file JSON contenente 'Infinity' (senza virgolette) come valore non sarà JSON valido. Non dovresti voler scrivere file JSON non conformi allo standard. – JohnB

+0

@DigvijayYadav, temo che dovrai vivere con la natura della bestia. – KooiInc

5

JSON non ha infinito o NaN, vedere questa domanda:

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

Quindi { b: Infinity, c: 10 } non è JSON valido. Se avete bisogno di codificare all'infinito in JSON, probabilmente necessario ricorrere a oggetti:

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

Questa struttura è generato da, dato il vostro esempio precedente fa quello che dici che fa,

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