Apakah urutan elemen dalam daftar JSON dipertahankan?

254

Saya perhatikan urutan elemen dalam objek JSON bukan urutan aslinya.

Bagaimana dengan elemen daftar JSON? Apakah pesanan mereka dipertahankan?

pengguna437899
sumber

Jawaban:

370

Ya, urutan elemen dalam array JSON dipertahankan. Dari RFC 7159 - Notasi Data JavaScript Objek (JSON) Format Pertukaran Data (penekanan tambang):

Objek adalah kumpulan unordered dari nol atau lebih pasangan nama / nilai, di mana nama adalah string dan nilai adalah string, angka, boolean, null, objek, atau array.

Array adalah memerintahkan urutan nol atau lebih nilai.

Istilah "objek" dan "array" berasal dari konvensi JavaScript.

Beberapa implementasi juga mempertahankan urutan objek JSON juga, tetapi ini tidak dijamin.

Jeremy Banks
sumber
Namun, saya telah berbicara dengan beberapa pengembang yang mengalami masalah di mana array TIDAK dipesan. Lihatlah bagian kata yang aneh ini di ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 'Sintaks JSON tidak mendefinisikan makna khusus apa pun pada urutan nilai-nilai tersebut. Namun, struktur array JSON sering digunakan dalam situasi di mana ada beberapa semantik untuk pemesanan. '
Cato
74

Urutan elemen dalam array ( []) dipertahankan. Urutan elemen (nama: pasangan nilai) dalam "objek" ( {}) tidak, dan itu biasa bagi mereka untuk menjadi "campur aduk", jika bukan oleh formatter / parser JSON itu sendiri maka oleh objek-objek khusus bahasa (Kamus, NSDictionary, Hashtable, dll) yang digunakan sebagai representasi internal.

Hot Licks
sumber
7

Secara praktis, jika kunci adalah tipe NaN, browser tidak akan mengubah urutan.

Script berikut akan menampilkan "Satu", "Dua", "Tiga":

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

Sedangkan skrip berikut akan menampilkan "Tiga", "Satu", "Dua":

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}
Salam Barbary
sumber
16
Tapi itu mengandalkan perilaku yang tidak terdefinisi dari JSON. Apa pun yang Anda bertukar mungkin tidak memiliki perilaku yang sama.
Hot Licks
3
Jawaban ini membahas objek. Pertanyaannya berkaitan dengan "daftar" json, yang hanya dapat disimpulkan sebagai susunan rata-rata, yang secara semantik dipesan oleh spesifikasi json (lihat jawaban Jeremy).
Tom
5

Beberapa mesin JavaScript menyimpan kunci dalam urutan penyisipan. V8, misalnya, menjaga semua kunci dalam urutan penyisipan kecuali untuk kunci yang dapat diuraikan sebagai bilangan bulat 32-bit yang tidak ditandatangani .

Ini berarti bahwa jika Anda menjalankan salah satu dari berikut ini:

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

Anda akan secara konsisten mendapatkan anjing , beruang , dan monyet dalam urutan itu, di Chrome, yang menggunakan V8. Node.js juga menggunakan V8. Ini akan berlaku bahkan jika Anda memiliki ribuan item. YMMV dengan mesin JavaScript lainnya.

Demo di sini dan di sini .

Benjamin Atkin
sumber
7
Tapi itu mengandalkan perilaku yang tidak terdefinisi dari JSON. Apa pun yang Anda bertukar mungkin tidak memiliki perilaku yang sama.
Hot Licks
1

"Apakah urutan elemen dalam daftar JSON dipertahankan?" bukan pertanyaan yang bagus. Anda perlu bertanya "Apakah urutan elemen dalam daftar JSON dipertahankan saat melakukan [...]?" Seperti yang Felix King tunjukkan, JSON adalah format data tekstual. Itu tidak bermutasi tanpa alasan. Jangan bingung string JSON dengan objek (JavaScript).

Anda mungkin berbicara tentang operasi JSON.stringify(JSON.parse(...)). Sekarang jawabannya adalah: Itu tergantung pada implementasinya. 99% * dari parser JSON tidak mempertahankan urutan objek, dan mempertahankan urutan array, tetapi Anda mungkin juga menggunakan JSON untuk menyimpan sesuatu seperti

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

dan menggunakan parser yang mempertahankan urutan objek.

* mungkin lebih :)

pengguna123444555621
sumber
1
Salah, setidaknya jika Anda berbicara tentang penggunaan parser JSON. V8 mempertahankan pesanan, dan tebakan saya adalah bahwa itu sendiri menyumbang lebih dari 1% dari penggunaan parser JSON. code.google.com/p/v8/issues/detail?id=164#c1
Benjamin Atkin
3
@ BenAtkin Sangat lucu bahwa tautan Anda mengarah ke penjelasan tentang bagaimana V8 tidak mempertahankan pesanan.
user123444555621
2
"Standar de facto adalah untuk mencocokkan pesanan penyisipan, yang V8 juga lakukan, tetapi dengan satu pengecualian"
Benjamin Atkin
14
Semua manusia adalah pria, tetapi dengan satu pengecualian: Wanita adalah wanita.
user123444555621