Я заметил, что порядок элементов в объекте JSON не является исходным.
Как насчет элементов списков JSON? Поддерживается ли их порядок?
Я заметил, что порядок элементов в объекте JSON не является исходным.
Как насчет элементов списков JSON? Поддерживается ли их порядок?
Да, порядок элементов в массивах JSON сохраняется. Из RFC 7159 - Формат обмена данными объектов JavaScript (JSON) (основное внимание):
Объектом является неупорядоченный набор из нуля или более имени/значения пары, где имя - это строка, а значение - строка, число, boolean, null, object или array.
Массив представляет собой упорядоченную последовательность с нулевым или большим значением.
Термины "объект" и "массив" исходят из JavaScript.
Сохраняется порядок элементов в массиве ([]
). Порядок элементов (имя: пары значений) в "объекте" ({}
) не является, и обычно для них "перепутаться", если не с самим форматором/парсером JSON, а затем с конкретными языковыми объектами (Словарь, NSDictionary, Hashtable и т.д.), Которые используются как внутреннее представление.
Практически говоря, если ключи имеют тип 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]);
}
Некоторые механизмы 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"
}
и использовать парсер, который поддерживает порядок объектов.
* возможно еще больше:)