Цілі числа JSON: обмеження розміру


81

Чи вказано де-небудь, наскільки великими можуть бути цілі числа JSON? Я здогадуюсь, що вони обмежені звичайними (32-бітовими) ints, але я ніде не можу знайти, що це записано. Мені потрібно кодувати ідентифікатори, довгі в Java, тому я вважаю, що мені потрібно зберігати їх як рядки в JSON, щоб не ризикувати переповненням.

Відповіді:


92

Номер JSON не обмежується специфікацією .

Граматика чисел JSON

Оскільки JSON - це абстрактний формат, який не націлений виключно на JavaScript, фактичне цільове середовище визначає межі того, що можна інтерпретувати.

Варто також зазначити, що не існує "JSON Integers", вони є підмножиною типу даних "Number".


12
З практичної точки зору, цілі числа Javascript обмежені приблизно 2 ^ 53 (цілих чисел немає; лише IEEE плаває). Але специфікація JSON цілком зрозуміла, що номери JSON мають необмежений розмір.
Нельсон

10
Хоча відповідь залишається технічно правильною, її варто було б оновити, оскільки RFC 7159 допомагає уточнити, який діапазон цілих чисел слід вважати сумісними. (тобто [-(2**53)+1, (2**53)-1].) Якщо ви працюєте поза цим діапазоном, тоді використовуйте цілі числа, закодовані рядком, або очікуйте, що реалізації втратять точність.
Tom Christie

@TomChristie Специфікація JSON не згадує RFC7159.
Томалак

4
@Tomalak - Звичайно - RFC7159 з’явився пізніше (2014). З'ясовує деякі з раніше існуючих невідповідностей / випадків крайових ситуацій тощо (наприклад, відсутність будь-якої згадки про дієві числові діапазони)
Том Крісті,

2
Хм, детально прочитавши RFC, він все одно не обмежує цифри. Це лише натякає на те, що багато систем використовують IEEE754 внутрішньо, і що цей факт може поставити практичні обмеження щодо того, що може інтерпретувати приймач, саме про це і говорилося у відповіді.
Томалак

18

RFC 7159: Формат обміну даними об’єктної нотації JavaScript (JSON)

Ця специфікація дозволяє реалізаціям встановлювати обмеження на діапазон і точність прийнятих чисел. Оскільки програмне забезпечення, яке реалізує двійкові64 (з подвійною точністю) числа IEEE 754-2008 [IEEE754], загальнодоступне та широко використовується, хороша сумісність може бути досягнута завдяки реалізаціям, які не очікують більшої точності або діапазону, ніж вони надають, в тому сенсі, що реалізації будуть наближені до JSON числа в межах очікуваної точності. Номер JSON, такий як 1E400 або 3.141592653589793238462643383279, може вказувати на потенційні проблеми сумісності, оскільки передбачає, що програмне забезпечення, яке воно створило, розраховує на отримання програмного забезпечення більшими можливостями для числової величини та точності, ніж широко доступні.


"широко доступний" - це неясна мова, IMO. Тим часом деякі реалізації (наприклад, стандартний jsonмодуль Python ) виконують синтаксичний аналіз довільних цілих чисел, навіть перевищують 64 біт (вбудовані bignums).
Томаш

"широкодоступний" не настільки розмитий, коли раніше зазначалося, що IEEE754 "широко використовується".
Джейсон Уорнер,

8

Я щойно зробив наступний емпіричний тест за допомогою консолі Chrome (v.23 на Mac):

> var j = JSON.parse("[999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999]")
undefined

> j[0]
1e+228

Якщо JSON передається через HTTP, то число в будь-якому випадку буде перетворено у рядку з Java, і тоді проблема може бути лише в Javascript.

З специфікації мови ECMAScript 4.3.19 :

4.3.19 Значення числа

примітивне значення, яке відповідає подвійній точності 64-бітового бінарного формату значення IEEE 754

ПРИМІТКА.Значення Число є членом типу Число і є прямим поданням числа.

Що визначено у wikipedia Формат із плаваючою комою з подвійною точністю .


2
Дякую. Цю структуру JSON видає внутрішній веб-сервіс на Java, тому, відповідаючи @ Tomalak, я думаю, мені потрібно перевірити, що насправді робить моя бібліотека JSON на стороні сервера.
Ян Дікінсон,

3
І для запису, Джексон робить синтаксичний аналіз довгих цілих чисел у введенні JSON правильно в Java longs.
Ян Дікінсон,

А також для запису, Джексон правильно випускає Java longs, але принаймні браузери на базі Chrome встановлюють останні 3 десяткові цифри рівними нулю, тобто довжина числа правильна, але останні 3 десяткові крапки завжди читають 000
Йоганнес Яндер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.