JSON Не преобразовывать длинные номера соответствующим образом

У меня есть простой JSON, где число не обрабатывается правильно.

[
  {
    "orderNumber": 1,
    "customerId": 228930314431312345,
    "shoppingCartId": 22893031443137109,
    "firstName": "jjj"
  }
]

Я попробовал @http://www.utilities-online.info/xmltojson/, и результат был

<?xml version="1.0" encoding="UTF-8" ?>
<orderNumber>1</orderNumber>
<customerId>228930314431312350</customerId>
<shoppingCartId>22893031443137108</shoppingCartId>
<firstName>jjj</firstName>

Как вы можете видеть... XML отличается от JSON. Я новичок в JSON. Я что-то пропустил?

Ответ 1

Это проблема точности Javascript.

В соответствии с Mozilla Developer Network:

ECMA-262 требует только до 21 значащей цифры. Другие реализации могут не поддерживать точность, превышающую требования стандарта.

Источник: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toPrecision

Я вставил ваш массив в консоль Javascript Google Chrome и получил это: Javascript precision bug

Итак, похоже, что Javascript округляет значения до того, как они преобразуются в XML. Поскольку ваше преобразование выполняется через Javascript в браузере в http://www.utilities-online.info/xmltojson/, имеет смысл, почему номер был изменен.

(Примечание: я тестировал версию Google Chrome 26.0.1410.43 m с помощью Windows 7 Professional)

Edit:

Есть ли причина, по которой вы не можете передать эти значения в Javascript как строки?

Попробуйте следующее:

[
  {
    "orderNumber": "1",
    "customerId": "228930314431312345",
    "shoppingCartId": "22893031443137109",
    "firstName": "jjj"
  }
]

Я смог сделать это и успешно сохранить значения. Тем не менее, вы не сможете запускать математический расчет на них в Javascript, не теряя при этом определенной точности, если, конечно, вы не делаете что-то вроде умножения на 0.

Javascript precision string workaround

Это также правильно преобразуется в XML, используя вашу ссылку http://www.utilities-online.info/xmltojson/.

Ответ 2

Javascript представляет свои числа как плавающие по двойной точности, которые ограничивают наибольшее целое число, которое может быть представлено + +9007199254740992. Вот документация ECMA.