Чи збережений порядок елементів у списку JSON?


254

Я помітив, що порядок елементів в об'єкті JSON не є початковим порядком.

Що з елементами списків JSON? Чи підтримується їх порядок?

Відповіді:


370

Так, порядок елементів у масивах JSON зберігається. Від RFC 7159 -Формат обміну даними обєктації JavaScript (JSON) (міна акценту):

Об'єкт - це не упорядкована колекція нульових або більше пар імен / значень, де ім'я - це рядок, а значення - рядок, число, булеве значення, null, об'єкт або масив.

Масив - це впорядкована послідовність нульових або більше значень.

Терміни "об'єкт" і "масив" походять від умовних положень JavaScript.

Деякі реалізації також зберігають порядок об'єктів JSON, але це не гарантується.


Однак я говорив з деякими розробниками, які стикалися з проблемами, коли масиви НЕ впорядковані. Подивіться на цей дивно сформульований уривок у ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf "Синтаксис JSON не визначає конкретного значення для впорядкування значень. Однак структура масиву JSON часто використовується в ситуаціях, коли є певна семантика впорядкування. '
Катон

73

Порядок елементів у масиві ( []) підтримується. Порядок елементів (ім'я: пари значень) в "об'єкті" ( {}) не є, і для них зазвичай "переплутано", якщо не самим форматником / аналізатором JSON, то об'єктами, що відповідають мові (Словник, NSDictionary, Hashtable тощо), які використовуються як внутрішнє представлення.


7

Практично кажучи, якщо ключі були типу NaN, браузер не змінить порядок.

Наступний сценарій виведе "Один", "Два", "Три":

var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

Тоді як наступний сценарій виведе "Три", "Один", "Два":

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

16
Але це покладається на невизначену поведінку з боку JSON. Все, з чим ви спілкуєтесь, може не мати однакової поведінки.
Гарячі лизання

3
Ця відповідь обговорює предмет. Питання стосується json "списку", який можна зробити лише для значення масиву, який семантично упорядковується специфікацією json (див. Відповідь Джеремі).
Том

5

Деякі двигуни JavaScript зберігають ключі в порядку вставки. Наприклад, V8 зберігає всі ключі в порядку вставки, за винятком ключів, які можна проаналізувати як непідписані 32-бітні цілі числа .

Це означає, що якщо ви виконаєте будь-яке з наведених нижче дій:

var animals = {};
animals['dog'] = true;
animals['bear'] = true;
animals['monkey'] = true;
for (var animal in animals) {
  if (animals.hasOwnProperty(animal)) {
    $('<li>').text(animal).appendTo('#animals');
  }
}
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }');
for (var animal in animals) {
  $('<li>').text(animal).appendTo('#animals');
}

Ви будете послідовно отримувати собаку , ведмедя та мавпу в такому порядку на Chrome, який використовує V8. Node.js також використовує V8. Це справедливо, навіть якщо у вас є тисячі предметів. YMMV з іншими двигунами JavaScript.

Демо тут і тут .


7
Але це покладається на невизначену поведінку з боку JSON. Все, з чим ви спілкуєтесь, може не мати однакової поведінки.
Гарячі лизання

1

"Чи підтримується порядок елементів у списку JSON?" питання не є гарним. Вам потрібно запитати "Чи підтримується порядок елементів у списку JSON під час виконання [...]?" Як зазначив Фелікс Кінг, JSON - це текстовий формат даних. Він не мутує без причини. Не плутайте рядок JSON з об’єктом (JavaScript).

Ви, мабуть, говорите про такі операції JSON.stringify(JSON.parse(...)). Тепер відповідь така: Це залежить від реалізації. 99% * парсерів JSON не підтримують порядок об'єктів і підтримують порядок масивів, але ви також можете використовувати JSON для зберігання чогось подібного

{
    "son": "David",
    "daughter": "Julia",
    "son": "Tom",
    "daughter": "Clara"
}

і використовувати аналізатор, який підтримує порядок об'єктів.

* напевно, навіть більше :)


1
Неправильно, принаймні, якщо ви говорите про використання аналізатора JSON. V8 підтримує порядок, і я гадаю, що лише на нього припадає більше 1% використання аналізатора JSON. code.google.com/p/v8/isissue/detail?id=164#c1
Бенджамін Аткін

3
@BenAtkin Смішно, що ваше посилання вказує на пояснення того, як V8 не підтримує порядок.
користувач123444555621

2
"Стандартним фактором є відповідність порядку вставки, що і V8, але за винятком"
Бенджамін Аткін

14
Всі люди чоловіки, але за одним винятком: жінки - жінки.
користувач123444555621
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.