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

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

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

5 ответов


да, порядок элементов в массивах JSON сохраняется. От RFC 7159-формат обмена данными JavaScript Object Notation (JSON) (выделено мной):

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

массив-это приказал последовательность из нуля или более значений.

термины "объект" и "массив" происходят из соглашений Яваскрипт.


порядок элементов в массиве ([]) сохраняется. Порядок элементов (имя:пары значений) в "объекте" ({}) нет, и обычно они "перемешиваются", если не самим JSON formatter/parser, то языковыми объектами (Dictionary, 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. Узел.js также использует V8. Это будет справедливо, даже если у вас тысячи предметов. YMMV с другими движками JavaScript.

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


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

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

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

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

*наверное, даже больше :)