Bisakah sebuah array menjadi teks JSON tingkat atas?

Jawaban:

126

Ya, array legal sebagai teks JSON tingkat atas.

Ada tiga dokumen standar yang mendefinisikan JSON: RFC 4627 , RFC 7159 (yang menggantikan RFC 4627), dan ECMA-404 . Mereka berbeda dalam elemen tingkat atas yang mereka izinkan, tetapi semua mengizinkan objek atau larik sebagai elemen tingkat atas.

  • RFC 4627: Objek atau larik.
    "Teks JSON adalah objek atau larik berseri."
  • RFC 7159: Setiap nilai JSON.
    "Teks JSON adalah nilai serial."
  • ECMA-404: Nilai JSON apa pun.
    "Teks JSON adalah urutan token yang dibentuk dari poin kode Unicode yang sesuai dengan tata bahasa nilai JSON."
sleske
sumber
2
Untuk RFC yang lebih baru ini , "Teks JSON adalah urutan token. Kumpulan token mencakup enam karakter struktural, string, angka, dan tiga nama literal."
antak
63

Ya , tetapi Anda harus mempertimbangkan untuk menjadikan root sebagai objek dalam beberapa skenario, karena pembajakan JSON . Ini adalah kerentanan pengungkapan informasi berdasarkan penggantian konstruktor array di JavaScript.

Matthew Flaschen
sumber
11
Ya, itulah ciri khas dari jawaban yang bagus - tidak hanya memberi tahu OP apa yang ingin mereka ketahui, tetapi juga apa yang harus mereka ketahui (tetapi tidak mereka sadari). Sebenarnya, ada banyak kerentanan yang terkait dengan JSON yang diurai sebagai Javascript, pembajakan JSON hanyalah satu contoh.
sleske
9
FWIW, pembajakan JSON bukanlah masalah untuk browser modern .
Franklin Yu
4

Ini dari spesifikasi ECMAScript.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber
ChaosPandion
sumber
1
Ini sedikit menyesatkan, karena ECMAScript memungkinkan Anda mengurai string JSON yang bukan teks tingkat atas. Menurut RFC, "Teks JSON adalah objek atau larik berseri."
Matthew Flaschen
@ Matthew - Aneh, saya bertanya-tanya bagaimana perasaan Crockford tentang itu. Bagaimana mereka akan mendamaikan perbedaan antara RFC dan ECMA?
ChaosPandion
3
Saya hanya melihat, dan menemukan mereka menyadari perbedaannya. Dari ECMAScript 5 §15.12, "Produksi JSONText tingkat atas dari tata bahasa JSON ECMAScript dapat terdiri dari JSONValue apa pun, bukan dibatasi menjadi JSONObject atau JSONArray seperti yang ditentukan oleh RFC 4627." Saya tidak tahu apakah IETF akan mengubah RFC.
Matthew Flaschen
@Matthew - Terima kasih untuk itu, saya menjadi sangat bingung. Deskripsi json.org tidak menyebutkan konsep "json-text" yang lebih ketat sama sekali , dan jenis RFC yang tidak jelas tentang signifikansinya.
mrec
Jawaban ini tentang ECMAScript, tetapi pertanyaannya tentang JSON. Meskipun mereka (sengaja) terlihat serupa, spesifikasi mereka berbeda .
sleske
2

ya, coba di sini.

http://www.jsonlint.com/

dan masukkan [{}]

hvgotcodes
sumber
3
Lebih mudah dari itu. Masukkan []dan itu akan divalidasi.
sorpigal
Tautan sudah mati, harap perbarui, atau hapus, jawaban — hampir hanya tautan — ini.
Anthon
1

Ada beberapa kebingungan, terlihat di komentar lain. Jenis media "application / json" hanya mengizinkan objek atau larik di tingkat atas untuk teks JSON , sesuai dengan JSON RFC . Namun, untuk parser, nilai JSON apa pun dapat diterima, seperti yang terlihat dalam spesifikasi ECMAScript.

cdunn2001
sumber
Setiap nilai JSON sebagai elemen tingkat atas dapat diterima untuk pengurai ECMAScript , tetapi tidak untuk pengurai JSON (yang sesuai) - perbedaan penting.
sleske
Itu perbedaan yang menarik, tapi saya tidak mengerti apa yang Anda katakan. Apa definisi "pengurai JSON (sesuai)"?
cdunn2001
1
Nah, parser JSON adalah parser untuk tata bahasa JSON. Meskipun JSON terlihat mirip dengan Javascript, ini adalah tata bahasa yang berbeda (jauh lebih sederhana). Lihat tools.ietf.org/html/rfc7159 , yang menjelaskan tata bahasa JSON. "compliant" berarti pengurai benar-benar mengikuti tata bahasa (yang harus dilakukan oleh pengurai yang layak).
sleske
3
RFC 4627 sudah usang, mohon jangan ikuti lagi. RFC baru juga mengizinkan nilai-nilai sederhana di tingkat atas.
Matthias Dieter Wallnöfer