Wird die Reihenfolge der Elemente in einer JSON-Liste beibehalten?

254

Ich habe festgestellt, dass die Reihenfolge der Elemente in einem JSON-Objekt nicht der ursprünglichen Reihenfolge entspricht.

Was ist mit den Elementen von JSON-Listen? Wird ihre Bestellung aufrechterhalten?

user437899
quelle

Antworten:

370

Ja, die Reihenfolge der Elemente in JSON-Arrays bleibt erhalten. Aus RFC 7159 - Das JSON-Datenaustauschformat ( JavaScript Object Notation) (Schwerpunkt Mine):

Ein Objekt ist eine ungeordnete Sammlung von null oder mehr Name / Wert-Paaren, wobei ein Name eine Zeichenfolge und ein Wert eine Zeichenfolge, eine Zahl, ein Boolescher Wert, eine Null, ein Objekt oder ein Array ist.

Ein Array ist eine geordnete Folge von null oder mehr Werten.

Die Begriffe "Objekt" und "Array" stammen aus den Konventionen von JavaScript.

Einige Implementierungen behalten auch die Reihenfolge der JSON-Objekte bei, dies ist jedoch nicht garantiert.

Jeremy Banks
quelle
Ich habe jedoch mit einigen Entwicklern gesprochen, bei denen Probleme aufgetreten sind, bei denen Arrays NICHT bestellt werden. Schauen Sie sich diese seltsam formulierte Passage in ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf an. 'Die JSON-Syntax definiert keine spezifische Bedeutung für die Reihenfolge der Werte. Die JSON-Array-Struktur wird jedoch häufig in Situationen verwendet, in denen die Reihenfolge eine gewisse Semantik aufweist. '
Cato
74

Die Reihenfolge der Elemente in einem Array ( []) wird beibehalten. Die Reihenfolge der Elemente (Name: Wertepaare) in einem "Objekt" ( {}) ist nicht und es ist üblich, dass sie "durcheinander gebracht" werden, wenn nicht vom JSON-Formatierer / Parser selbst, dann von den sprachspezifischen Objekten (Dictionary, NSDictionary, Hashtable usw.), die als interne Darstellung verwendet werden.

Hot Licks
quelle
7

In der Praxis ändert der Browser die Reihenfolge nicht, wenn die Schlüssel vom Typ NaN waren.

Das folgende Skript gibt "Eins", "Zwei", "Drei" aus:

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

Während das folgende Skript "Drei", "Eins", "Zwei" ausgibt:

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}
Salam Barbary
quelle
16
Dies beruht jedoch auf undefiniertem Verhalten von JSON. Alles, mit dem Sie sich austauschen, hat möglicherweise nicht das gleiche Verhalten.
Hot Licks
3
Diese Antwort beschreibt ein Objekt. Die Frage bezieht sich auf die json "Liste", die nur als mittleres Array abgeleitet werden kann, das semantisch nach json-Spezifikation geordnet ist (siehe Jeremys Antwort).
Tom
5

Einige JavaScript-Engines halten die Schlüssel in der Einfügereihenfolge. In V8 werden beispielsweise alle Schlüssel in Einfügereihenfolge gehalten, mit Ausnahme von Schlüsseln, die als vorzeichenlose 32-Bit-Ganzzahlen analysiert werden können .

Dies bedeutet, wenn Sie eine der folgenden Aktionen ausführen:

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

Auf Chrome, das V8 verwendet, erhalten Sie regelmäßig Hunde , Bären und Affen in dieser Reihenfolge. Node.js verwendet auch V8. Dies gilt auch dann, wenn Sie Tausende von Artikeln haben. YMMV mit anderen JavaScript-Engines.

Demo hier und hier .

Benjamin Atkin
quelle
7
Dies beruht jedoch auf undefiniertem Verhalten von JSON. Alles, mit dem Sie sich austauschen, hat möglicherweise nicht das gleiche Verhalten.
Hot Licks
1

"Wird die Reihenfolge der Elemente in einer JSON-Liste beibehalten?" ist keine gute Frage. Sie müssen fragen: "Wird die Reihenfolge der Elemente in einer JSON-Liste beibehalten, wenn Sie [...] ausführen?" Wie Felix King betonte, ist JSON ein Textdatenformat. Es mutiert nicht ohne Grund. Verwechseln Sie eine JSON-Zeichenfolge nicht mit einem (JavaScript-) Objekt.

Sie sprechen wahrscheinlich über Operationen wie JSON.stringify(JSON.parse(...)). Jetzt lautet die Antwort: Es kommt auf die Implementierung an. 99% * der JSON-Parser behalten nicht die Reihenfolge der Objekte und die Reihenfolge der Arrays bei, aber Sie können auch JSON verwenden, um so etwas zu speichern

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

und verwenden Sie einen Parser, der die Reihenfolge der Objekte beibehält.

* wahrscheinlich noch mehr :)

user123444555621
quelle
1
Falsch, zumindest wenn Sie über die Verwendung von JSON-Parsern sprechen. V8 behält die Reihenfolge bei, und ich vermute, dass sie allein mehr als 1% der JSON-Parser-Nutzung ausmacht. code.google.com/p/v8/issues/detail?id=164#c1
Benjamin Atkin
3
@ BenAtkin Es ist lustig, dass Ihr Link auf die Erklärung verweist, wie V8 die Reihenfolge nicht einhält .
user123444555621
2
"Der De-facto-Standard besteht darin, die Einfügereihenfolge zu erfüllen, was auch V8 tut, aber mit einer Ausnahme"
Benjamin Atkin,
14
Alle Menschen sind männlich, aber mit einer Ausnahme: Frauen sind weiblich.
user123444555621