Сохраняется ли порядок элементов в списке JSON?

Я заметил, что порядок элементов в объекте JSON не является исходным.

Как насчет элементов списков JSON? Поддерживается ли их порядок?

Ответ 1

Да, порядок элементов в массивах JSON сохраняется. Из RFC 7159 - Формат обмена данными объектов JavaScript (JSON) (основное внимание):

Объектом является неупорядоченный набор из нуля или более имени/значения пары, где имя - это строка, а значение - строка, число, boolean, null, object или array.

Массив представляет собой упорядоченную последовательность с нулевым или большим значением.

Термины "объект" и "массив" исходят из JavaScript.

Ответ 2

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

Ответ 3

Практически говоря, если ключи имеют тип NaN, браузер не изменит порядок.

Следующий script будет выводить "Один", "Два", "Три":

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

В то время как следующий script будет выводить "Три", "Один", "Два":

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

Ответ 4

Некоторые механизмы 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.

Демо здесь и здесь.

Ответ 5

"Поддерживается ли порядок элементов в списке JSON?" это не очень хороший вопрос. Вы должны спросить: "Сохраняется ли порядок элементов в списке JSON при выполнении [...]?" Как отметил Феликс Кинг, JSON является текстовым форматом данных. Он не мутирует без причины. Не путайте строку JSON с объектом (JavaScript).

Вероятно, вы говорите об операциях типа JSON.stringify(JSON.parse(...)). Теперь ответ: это зависит от реализации. 99% * парсеров JSON не поддерживают порядок объектов и поддерживают порядок массивов, но вы также можете использовать JSON для хранения чего-то вроде

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

и использовать парсер, который поддерживает порядок объектов.

* возможно еще больше:)