Я помітив, що порядок елементів в об'єкті JSON не є початковим порядком.
Що з елементами списків JSON? Чи підтримується їх порядок?
Я помітив, що порядок елементів в об'єкті JSON не є початковим порядком.
Що з елементами списків JSON? Чи підтримується їх порядок?
Відповіді:
Так, порядок елементів у масивах JSON зберігається. Від RFC 7159 -Формат обміну даними обєктації JavaScript (JSON) (міна акценту):
Об'єкт - це не упорядкована колекція нульових або більше пар імен / значень, де ім'я - це рядок, а значення - рядок, число, булеве значення, null, об'єкт або масив.
Масив - це впорядкована послідовність нульових або більше значень.
Терміни "об'єкт" і "масив" походять від умовних положень JavaScript.
Деякі реалізації також зберігають порядок об'єктів JSON, але це не гарантується.
Порядок елементів у масиві ( []
) підтримується. Порядок елементів (ім'я: пари значень) в "об'єкті" ( {}
) не є, і для них зазвичай "переплутано", якщо не самим форматником / аналізатором JSON, то об'єктами, що відповідають мові (Словник, NSDictionary, Hashtable тощо), які використовуються як внутрішнє представлення.
Практично кажучи, якщо ключі були типу 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]);
}
Деякі двигуни 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.
"Чи підтримується порядок елементів у списку JSON?" питання не є гарним. Вам потрібно запитати "Чи підтримується порядок елементів у списку JSON під час виконання [...]?" Як зазначив Фелікс Кінг, JSON - це текстовий формат даних. Він не мутує без причини. Не плутайте рядок JSON з об’єктом (JavaScript).
Ви, мабуть, говорите про такі операції JSON.stringify(JSON.parse(...))
. Тепер відповідь така: Це залежить від реалізації. 99% * парсерів JSON не підтримують порядок об'єктів і підтримують порядок масивів, але ви також можете використовувати JSON для зберігання чогось подібного
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
і використовувати аналізатор, який підтримує порядок об'єктів.
* напевно, навіть більше :)