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?
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?
Antworten:
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.
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.
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]);
}
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.
"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 :)