2013-05-20 3 views
11

Я JavaScript Object сказать:JSON.stringify преобразования бесконечности до нуля

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

Когда я

var b = JSON.stringify(a); 

возвращает следующее

б = "{" Ъ ": нулевая , "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 в null.

Как решить эту проблему.

ответ

9

Как и другие ответы, указанных, Infintity не является частью значения JSON можно сохранить в качестве значения.

Вы можете полностью изменить метод цензор на разбор JSON:

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

Это я всегда могу сделать, но было бы неплохо, чтобы получить бесконечность не «бесконечность», так как мне не нужно, чтобы выполнить это дополнительная проверка моих сотен объектов, имеющих сотни свойств. –

+0

Как я писал в своем ответе, JSON-файл, содержащий 'Infinity' (без кавычек) в качестве значения, не будет действителен JSON. Вы не должны писать нестандартные JSON-файлы. – JohnB

+0

@ DigvijayYadav, боюсь, вам придется жить с природой зверя. – KooiInc

5

JSON не имеет бесконечность или 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); 
Смежные вопросы