JSON listesindeki öğelerin sırası korunuyor mu?


254

Orijinal sipariş olmayan bir JSON nesnesindeki öğelerin sırasını fark ettim.

JSON listelerinin öğeleri ne olacak? Emirleri korunuyor mu?

Yanıtlar:


371

Evet, JSON dizilerindeki öğelerin sırası korunur. Gönderen RFC 7159 -The JavaScript Object Notation (JSON) Veri Değişim Biçimi (vurgu benim):

Nesne, bir adın bir dize ve bir değerin bir dize, sayı, boole, null, nesne veya dizi olduğu sıfır veya daha fazla ad / değer çiftinin sırasız bir koleksiyonudur.

Dizi, sıfır veya daha fazla değerin sıralı bir dizisidir.

"Nesne" ve "dizi" terimleri JavaScript kurallarından gelir.

Bazı uygulamalar JSON nesnelerinin sırasını da korur, ancak bu garanti edilmez.


Ancak, dizilerin SİPARİŞ EDİLMEMİŞ olduğu sorunlarla karşılaşmış bazı geliştiricilerle konuştum. Ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf adresindeki bu tuhaf ifadelere sahip pasaja bir göz atın 'JSON sözdizimi, değerlerin sıralaması için herhangi bir anlam ifade etmiyor. Ancak, JSON dizi yapısı genellikle siparişle ilgili bazı anlambilimlerin olduğu durumlarda kullanılır. '
Cato

74

Bir dizideki ( []) öğelerin sırası korunur. Bir "nesne" ( {}) içindeki öğelerin sırası (isim: değer çiftleri) değildir ve JSON formatlayıcı / ayrıştırıcının kendisi tarafından değilse, dile özgü nesneler (Sözlük, NSDictionary, Hashtable, vb.) İçerir.


7

Pratik olarak, tuşlar NaN türündeyse, tarayıcı sırasını değiştirmez.

Aşağıdaki komut dosyası "Bir", "İki", "Üç" çıktısını verecektir:

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

Aşağıdaki komut dosyası "Üç", "Bir", "İki" çıktısını verir:

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

16
Ancak bu, JSON'un tanımlanmamış davranışına dayanmaktadır. Takas ettiğiniz hiçbir şey aynı davranışa sahip olmayabilir.
Hot Licks

3
Bu cevap bir nesneyi tartışıyor. Soru, json spesifikasyonu ile semantik olarak sıralanan ortalama diziye çıkarılabilen json "listesi" ile ilgilidir (Jeremy'nin cevabına bakınız).
Tom

5

Bazı JavaScript motorları anahtarları ekleme sırasında tutar. Örneğin V8, imzasız 32 bit tamsayı olarak ayrıştırılabilen anahtarlar dışındaki tüm anahtarları ekleme sırasında tutar .

Bu, aşağıdakilerden birini çalıştırırsanız anlamına gelir:

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

V8 kullanan Chrome'da sürekli olarak bu sırayla köpek , ayı ve maymun alacaksınız . Node.js ayrıca V8 kullanır. Binlerce öğeniz olsa bile bu geçerli olacaktır. Diğer JavaScript motorlarıyla YMMV.

Burada ve burada demo .


7
Ancak bu, JSON'un tanımlanmamış davranışına dayanmaktadır. Takas ettiğiniz hiçbir şey aynı davranışa sahip olmayabilir.
Hot Licks

1

"JSON listesindeki öğelerin sırası korunuyor mu?" iyi bir soru değil. "[...] yaparken bir JSON listesindeki öğelerin sırası korunur mu?" Sorusunu sormanız gerekir. Felix King'in işaret ettiği gibi JSON metinsel bir veri formatıdır. Sebepsiz değişmez. JSON dizesini (JavaScript) nesnesiyle karıştırmayın.

Muhtemelen gibi operasyonlardan bahsediyorsunuz JSON.stringify(JSON.parse(...)). Şimdi cevap: Bu uygulamaya bağlıdır. JSON ayrıştırıcılarının% 99'u * nesnelerin sırasını korumaz ve dizilerin sırasını korur, ancak JSON'u aşağıdaki gibi bir şeyi saklamak için de kullanabilirsiniz

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

ve nesnelerin sırasını koruyan bir ayrıştırıcı kullanın.

* muhtemelen daha da fazla :)


1
Yanlış, en azından JSON ayrıştırıcı kullanımı hakkında konuşuyorsanız. V8 siparişi korur ve tahminim tek başına JSON ayrıştırıcı kullanımının% 1'inden fazlasını oluşturuyor. code.google.com/p/v8/issues/detail?id=164#c1
Benjamin Atkin

3
Bu komik @BenAtkin V8 etmez nasıl açıklama için bağlantı noktaları olduğunu değil düzeni korumak.
user123444555621

2
"De facto standart, V8'in de yaptığı, ancak bir istisna dışında ekleme talimatı ile eşleşmektir"
Benjamin Atkin

14
Tüm insanlar erkektir, ancak bir istisna dışında: Kadınlar kadındır.
user123444555621
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.