Сохраняется ли порядок элементов в списке 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"
}
и использовать парсер, который поддерживает порядок объектов.
*наверное, даже больше :)