Czy kolejność elementów na liście JSON jest zachowana?

Zauważyłem, że kolejność elementów w obiekcie JSON nie jest pierwotną kolejnością.

A co z elementami list JSON? Czy ich kolejność jest utrzymana?

Author: Jeremy Banks, 2011-08-27

5 answers

Tak, kolejność elementów w tablicach JSON jest zachowana. Od RFC 7159-format wymiany danych JavaScript Object Notation (JSON) (podkreślenie):

Obiekt jest nieuporządkowanym zbiorem o zerowej lub większej liczbie nazw/wartości pary, gdzie nazwa jest łańcuchem, a wartość jest łańcuchem, liczba, boolean, null, object lub array.

Tablica jest uporządkowaną sekwencją zero lub więcej wartości.

Terminy "obiekt" i "tablica" pochodzą z Konwencji JavaScript.

 275
Author: Jeremy Banks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 06:34:07

Kolejność elementów w tablicy ([]) jest zachowana. Kolejność elementów (nazwa: pary wartości) w" obiekcie "({}) nie jest, i zwykle są one "pomieszane", jeśli nie przez sam formatator/parser JSON, to przez obiekty specyficzne dla języka (Słownik, Nsdictionary, Hashtable, itp.), które są używane jako wewnętrzna reprezentacja.

 50
Author: Hot Licks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-27 11:45:22

Praktycznie rzecz biorąc, jeśli klucze były typu NaN, przeglądarka nie zmieni kolejności.

Następujący skrypt wyświetli "Jeden"," Dwa","Trzy":

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

Natomiast następujący skrypt wyświetli "trzy", "jeden", "dwa":

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}
 8
Author: Salam Barbary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-27 08:28:50

Niektóre silniki JavaScript zachowują klucze w kolejności wstawiania. Na przykład V8 zachowuje wszystkie klucze w kolejności wstawiania, z wyjątkiem kluczy, które mogą być przetwarzane jako niepodpisane 32-bitowe liczby całkowite .

Oznacza to, że jeśli uruchomisz jedną z następujących opcji:

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');
}

Będziesz konsekwentnie dostawał psa, bear imonkey w tej kolejności na Chrome, który używa V8. Węzeł.js używa również V8. Będzie to prawdą, nawet jeśli masz tysiące przedmiotów. YMMV z innymi Silniki JavaScript.

Demo tutaj i tutaj .

 5
Author: Ben Atkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 15:15:48

" czy kolejność elementów w liście JSON jest zachowana?"to nie jest dobre pytanie. Musisz zapytać " to kolejność elementów na liście JSON utrzymywana podczas wykonywania [...] ?" Jak zauważył Felix King, JSON jest formatem danych tekstowych. Nie mutuje bez powodu. Nie należy mylić łańcucha JSON z obiektem (JavaScript).

Prawdopodobnie mówisz o takich operacjach jak JSON.stringify(JSON.parse(...)). Teraz odpowiedź brzmi: to zależy od wdrożenia. 99% * parserów JSON nie utrzymuje kolejności obiektach, i zachowują kolejność tablic, ale równie dobrze możesz użyć JSON do przechowywania czegoś takiego jak

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

I używać parsera, który utrzymuje porządek obiektów.

*prawdopodobnie nawet więcej :)

 3
Author: user123444555621,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-27 13:12:52