Сохранен ли порядок элементов в списке JSON? - PullRequest
210 голосов
/ 27 августа 2011

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

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

Ответы [ 5 ]

314 голосов
/ 27 августа 2011

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

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

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

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

58 голосов
/ 27 августа 2011

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

7 голосов
/ 27 июня 2013

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

Следующий скрипт выведет «One», «Two», «Three»:

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]);
}
5 голосов
/ 07 июля 2012

Некоторые движки 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.

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

3 голосов
/ 27 августа 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...