Bahasa Indonesia

Alat pengembang · JSON pemformat & validator

JavaScript objek literal vs JSON: mengapa tanda kutip tunggal gagal validasi

· Cara kerjanya

json alur kerja pengembang validasi

JavaScript literal objek vs JSON: mengapa tanda kutip tunggal gagal validasi yang diilustrasikan dengan token JSON dan batas validasi yang tepat
Ilustrasi vektor ToolAcre asli

Objek yang dicetak oleh konsol JavaScript tampak seperti JSON tetapi biasanya tidak. Posting ini mencantumkan perbedaan sebenarnya (tanda kutip, kunci yang tidak diberi tanda kutip, tidak ditentukan, fungsi) dan menunjukkan di mana masing-masingnya membuat validator tersandung.

Itu keluar dari konsol, jadi mengapa tidak valid?

Itu keluar dari konsol, jadi mengapa tidak valid? — konsol pengembang menampilkan nilai JavaScript sebagai JavaScript teks seperti sumber, bukan sebagai serialisasi JSON yang dijamin. Objek yang disalin mungkin berisi nama properti, string dengan tanda kutip tunggal, `undefined`, atau anotasi khusus browser. Semua ini dapat dimengerti oleh mesin JavaScript atau pembaca manusia, sementara file `.json` langsung gagal, yang tata bahasanya sengaja dibuat lebih kecil dan tidak bergantung pada kode yang dapat dieksekusi.

Pertimbangkan `{name: "Ada", active: true, missing: undefined}`. Tanda kurung kurawal, titik dua, dan boolean menyerupai JSON, tetapi kunci kosong pertama sudah melanggar aturan anggota objek, dan `undefined` nantinya akan gagal. ToolAcre melaporkan karakter atau nilai pertama yang tidak didukung dengan baris dan kolom, jadi konversi sebaiknya dilakukan secara berurutan.

String harus menggunakan tanda kutip ganda

String harus menggunakan tanda kutip ganda — JSON mendefinisikan string sebagai karakter yang diapit oleh `"`, dengan escape backslash jika diperlukan. Kutipan tunggal tidak memiliki peran sebagai pembatas string. Ketika validator bertemu `'Ada'`, validator tidak memulai sebuah string dan kemudian menolak isinya; itu menolak apostrof pembuka itu sendiri. Hal ini juga berlaku untuk nama properti dan nilai string, meskipun JavaScript mengizinkan salah satu gaya kutipan untuk literalnya sendiri.

Mengonversi tanda kutip memerlukan kehati-hatian lebih dibandingkan mengganti setiap apostrof secara global. Tanda kutip di dalam teks seperti `Ada's profile` adalah konten biasa jika nilainya diberi tanda kutip ganda, sedangkan tanda kutip ganda yang ada di dalam konten tersebut harus di-escape. Formulir JSON yang valid adalah `"Ada's "profile""`.

Kunci harus berupa string yang dikutip

Kunci harus berupa string yang dikutip — literal objek JavaScript mengizinkan nama bergaya pengidentifikasi seperti `{name: 1}` dan nama yang dihitung seperti `{[expression]: 1}`. JSON tidak mengizinkan tulisan cepat apa pun. Setelah kurung kurawal atau koma pembuka, anggota berikutnya harus diawali dengan string tanda kutip ganda, diikuti dengan titik dua. Representasi yang valid adalah `{"name": 1}`. Validator yang menunjuk ke `n` mengidentifikasi tempat yang tepat di mana penawaran harga diperlukan.

Mengutip setiap kunci juga menghilangkan ambiguitas seputar spasi, tanda hubung, dan kata-kata khusus. JavaScript mungkin memerlukan sintaks sumber yang berbeda untuk kasus tersebut, namun JSON menggunakan satu aturan yang konsisten: `"display-name"`, `"first name"` dan `"default"` semuanya adalah nama anggota biasa. Kunci yang tampak numerik juga merupakan string.

JSON tidak punya arti

Nilai JSON sama sekali tidak dimiliki — kosakata nilainya adalah objek, array, string, angka, `true`, `false` dan `null`. Tidak ada `undefined`, `NaN`, `Infinity`, fungsi, ekspresi reguler, BigInt, atau literal Tanggal. Komentar tidak ada dalam tata bahasa, dan angka tidak boleh menggunakan tanda heksadesimal, biner, tanda plus di depan, atau pemisah angka JavaScript. Setiap konstruksi yang dipinjam pada akhirnya mencapai karakter yang tidak dapat memulai atau melanjutkan nilai JSON yang valid.

Konversi memerlukan keputusan data, bukan trik ejaan. Ganti `undefined` dengan `null` hanya jika nilai kosong eksplisit cocok dengan kontrak aplikasi; jika tidak, hapus anggota atau berikan nilai nyata. Enkode tanggal sebagai string yang disepakati, sering kali ISO 8601. Mewakili angka yang tidak terbatas menurut API penerima alih-alih membuat token JSON.

Contoh praktis: mengonversi dump konsol menjadi JSON yang valid

Contoh praktis: mengonversi dump konsol menjadi JSON yang valid — mulai dengan `{name: 'Ada', active: true, score: NaN, updated: new Date()}`. Kutip `name`, `active`, `score` dan `updated` dengan tanda kutip ganda. Ubah nilai nama menjadi string yang diberi tanda kutip ganda. Putuskan bahwa skor yang tidak tersedia harus `null`, dan ganti ekspresi konstruktor dengan string stempel waktu sebenarnya yang ingin dihasilkannya. Dokumen tersebut sekarang hanya berisi JSON anggota dan nilai.

Bentuk akhirnya mungkin `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}`. Validasi setelah setiap kategori perbaikan karena kesalahan pertama dapat menyembunyikan sintaksis khusus JavaScript nanti. Memformat hasil yang diterima kemudian memperlihatkan strukturnya tanpa melakukan konversi lebih lanjut.

Perangkap terbalik — JSON valid yang JavaScript akan dibaca secara berbeda, seperti bilangan bulat yang sangat besar dan kunci __proto__

Perangkap sebaliknya — JSON yang valid masih dapat memperoleh perilaku atau batasan khusus JavaScript setelah penguraian. Angka JSON tidak memiliki batas presisi bawaan dalam tata bahasanya, namun JSON.parse menghasilkan nilai angka JavaScript. Oleh karena itu, bilangan bulat di luar rentang aman dapat dibulatkan secara diam-diam. Jika setiap digit penting, kodekan pengidentifikasi sebagai string atau gunakan parser dan tipe data yang dirancang untuk mempertahankan angka presisi arbitrer daripada memercayai pemeriksaan sintaksis yang berhasil.

Nama anggota `"__proto__"` juga valid JSON dan JSON.parse menjadikannya sebagai properti data sendiri. Masalah dapat dimulai nanti jika kode aplikasi menyalin properti yang diurai ke objek lain dengan penetapan yang tidak aman atau perilaku penggabungan. Validasi membuktikan bahwa teks mengikuti tata bahasa JSON; hal ini tidak membuktikan bahwa setiap kunci aman bagi setiap konsumen.

Hal ini tidak tercakup dalam hal ini

Yang tidak tercakup dalam hal ini — JSON5, JSONC dan bahasa konfigurasi yang dengan sengaja menerima komentar, koma di akhir, nama tanpa tanda kutip, atau string dengan tanda kutip tunggal. Format tersebut menyelesaikan berbagai masalah penulisan dan memerlukan parser yang mengimplementasikan tata bahasanya sendiri. Validator JSON yang ketat tidak boleh menafsirkan ulang secara diam-diam, karena menerima sintaks tambahan akan membuat hasilnya menyesatkan untuk API, metadata paket, dan tujuan lain yang benar-benar memerlukan JSON standar.

Perbedaan ini juga tidak termasuk evaluasi JavaScript yang sewenang-wenang. Menjalankan teks yang ditempel melalui `eval` atau konstruktor Fungsi hanya untuk mengubah objek literal menjadi data dapat mengeksekusi pengambil, panggilan, atau ekspresi bermusuhan lainnya. Jika sumbernya dipercaya JavaScript di bawah kendali Anda, buat serial nilai sebenarnya dengan JSON.stringify. Jika sumbernya adalah teks yang tidak tepercaya, jangan jalankan.

Kesimpulan: literal adalah kode, JSON adalah data

Kesimpulan: literal adalah kode, JSON adalah data — kesamaan visual tidak membuat tata bahasanya dapat dipertukarkan. JSON memerlukan string tanda kutip ganda dan nama anggota, hanya mengizinkan sekumpulan kecil tipe nilai tetap dan tidak berisi komentar atau ekspresi yang dapat dieksekusi. Diagnostik baris dan kolom menandai tempat pertama sumber yang disalin meninggalkan tata bahasa tersebut. Memperbaiki titik tersebut dan memvalidasinya lagi lebih dapat diandalkan daripada menerapkan pencarian dan penggantian yang luas pada dump konsol.

Saat Anda mengontrol nilai JavaScript, hasilkan JSON dengan JSON.stringify alih-alih menyalin representasi konsolnya. Saat Anda menerima teks, parsinglah teks tersebut hanya dengan parser untuk format yang dideklarasikan dan jangan pernah menjalankannya sebagai pintasan. Validasi JSON yang berhasil menetapkan sintaksis, bukan presisi numerik, kesesuaian skema, atau penanganan properti hilir yang aman.