Saya sudah hati-hati membaca deskripsi JSON http://json.org/ tapi saya tidak yakin saya tahu jawaban atas pertanyaan sederhana. Apa string minimum JSON valid yang mungkin?
"string"
apakah string JSON itu valid?42
apakah angka sederhana itu valid JSON?true
Apakah nilai boolean JSON yang valid?{}
Apakah objek kosong JSON yang valid?[]
Apakah array kosong JSON yang valid?
javascript
json
validation
bessarabov
sumber
sumber
Jawaban:
Pada saat penulisan, JSON hanya dijelaskan dalam RFC4627 . Ini menjelaskan (pada awal "2") teks JSON sebagai objek atau larik berseri.
Ini berarti bahwa hanya
{}
dan[]
valid, string JSON lengkap dalam parser dan stringifiers yang mematuhi standar itu.Namun , pengenalan perubahan ECMA-404 itu, dan saran yang diperbarui dapat dibaca di sini . Saya juga menulis posting blog tentang masalah ini.
Untuk membingungkan masalah ini lebih lanjut,
JSON
objek (misalnyaJSON.parse()
danJSON.stringify()
) yang tersedia di browser web distandarisasi dalam ES5 , dan yang dengan jelas mendefinisikan teks JSON yang dapat diterima seperti:Ini berarti bahwa semua nilai JSON (termasuk string, nulls dan angka) diterima oleh objek JSON, meskipun objek JSON secara teknis mematuhi RFC 4627.
Perhatikan bahwa karena itu Anda dapat merangkai angka di browser yang sesuai melalui
JSON.stringify(5)
, yang akan ditolak oleh parser lain yang mematuhi RFC4627, tetapi yang tidak memiliki pengecualian khusus tercantum di atas. Ruby, misalnya, tampaknya merupakan salah satu contoh yang hanya menerima objek dan array sebagai root . PHP, di sisi lain, secara khusus menambahkan pengecualian bahwa "itu juga akan menyandikan dan mendekode jenis skalar dan NULL".sumber
true
,,false
ataunull
sendirian adalah teks JSON yang valid? Bisakah Anda mengutip sumber, karena ini bertentangan dengan sebagian besar jawaban / komentar lain di sini?Setidaknya ada empat dokumen yang dapat dianggap standar JSON di Internet. RFC yang dirujuk semuanya menggambarkan tipe mime
application/json
. Berikut adalah apa yang masing-masing katakan tentang nilai-nilai tingkat atas, dan apakah sesuatu selain objek atau array diperbolehkan di atas:RFC-4627 : Tidak.
Perhatikan bahwa RFC-4627 ditandai "informasi" sebagai lawan dari "standar yang diusulkan", dan bahwa itu usang oleh RFC-7159 , yang pada gilirannya usang oleh RFC-8259.
RFC-8259 : Ya.
RFC-8259 bertanggal Desember 2017 dan ditandai "STANDAR INTERNET".
ECMA-262 : Ya.
ECMA-404 : Ya.
sumber
Menurut definisi lama dalam RFC 4627 (yang sudah usang pada bulan Maret 2014 oleh RFC 7159), semua itu adalah "nilai JSON" yang valid, tetapi hanya dua yang terakhir yang merupakan "teks JSON" lengkap:
Bergantung pada parser yang digunakan, "JSON values" yang sendirian mungkin dapat diterima. Misalnya (menempel pada terminologi "nilai JSON" vs "teks JSON"):
JSON.parse()
fungsi sekarang standar di browser modern menerima setiap "nilai JSON"json_decode
diperkenalkan dalam versi 5.2.0 hanya menerima keseluruhan "teks JSON", tetapi diubah untuk menerima "nilai JSON" apa pun di versi 5.2.1json.loads
menerima "nilai JSON" apa pun sesuai dengan contoh di halaman manual iniPerbedaannya sedikit seperti perbedaan antara "dokumen XML" dan "fragmen XML", meskipun secara teknis
<foo />
dokumen XML yang terbentuk dengan baik (akan lebih baik ditulis seperti<?xml version="1.0" ?><foo />
, tetapi seperti yang ditunjukkan dalam komentar,<?xml
deklarasi secara teknis opsional ).sumber
<foo />
adalah well-formed dokumen XML, tapi tidak valid satu. (Tapi hal yang sama berlaku untuk<?xml version="1.0" ?><foo />
.)<foo />
mungkin atau mungkin tidak valid terhadap skema tertentu , tetapi bukan itu yang dinyatakan oleh standar itu.Spesifikasi ecma mungkin berguna untuk referensi:
http://www.ecma-international.org/ecma-262/5.1/
sumber
JSON.parse
Fungsi kemudian ditambahkan ke versi standar ECMAScript berdasarkan tata bahasa Crockford dan RFC.JSON.parse("\"string\"");
JSON adalah singkatan dari JavaScript Object Notation. Hanya
{}
dan[]
tentukan objek Javascript. Contoh lainnya adalah nilai literal. Ada tipe objek dalam Javascript untuk bekerja dengan nilai-nilai itu, tetapi ekspresi"string"
adalah representasi kode sumber dari nilai literal dan bukan objek.Perlu diingat bahwa JSON bukan Javascript. Ini adalah notasi yang mewakili data. Ini memiliki struktur yang sangat sederhana dan terbatas. Data JSON disusun menggunakan
{},:[]
karakter. Anda hanya bisa menggunakan nilai literal di dalam struktur itu.Ini sangat valid untuk server untuk merespons dengan deskripsi objek atau nilai literal. Semua parser JSON harus ditangani untuk menangani hanya nilai literal, tetapi hanya satu nilai. JSON hanya bisa mewakili satu objek pada satu waktu. Jadi agar server mengembalikan lebih dari satu nilai, ia harus menyusunnya sebagai objek atau array.
sumber
Ya, ya, ya, ya, dan ya. Semuanya adalah literal nilai JSON yang valid.
Namun, RFC 4627 resmi menyatakan:
Jadi seluruh "file" harus terdiri dari objek atau array sebagai struktur terluar, yang tentu saja bisa kosong. Namun, banyak parser JSON menerima nilai primitif juga untuk input.
sumber
Jadi jawaban Anda adalah
"{}"
yang menunjukkan objek kosong.sumber
undefined
, bukan "{}" `Cukup ikuti diagram rel yang diberikan di halaman json.org . [] dan {} adalah objek JSON valid minimum yang mungkin. Jadi jawabannya adalah [] dan {}.
sumber
array
danobject
Anda akan benar, tetapi masuk akal untuk mengharapkanvalue
menjadi awal.values
aturan sebagai gantinya (atau sebagai tambahan)array
danobject
aturan, maka angka dan string mandiri adalah dokumen JSON yang valid.[]
sementara teks JSON yang valid di bawah setiap spesifikasi yang pernah memiliki pendapat tentang masalah ini, bukanlah "objek JSON yang valid", karena itu bukan objek JSON. "Objek" di JSON secara khusus mengacu pada{}
notasi; Array JSON bukan objek JSON.