Alat pengembang · JSON pemformat & validator
JSON pelolosan string dijelaskan: \n, \uXXXX dan karakter kontrol
· Cara kerjanya
json alur kerja pengembang validasi
Baris baru mentah di dalam string JSON tidak valid, begitu pula tab. Posting ini mencakup delapan urutan escape, cara kerja \u escape dan pasangan pengganti, dan mengapa paragraf yang ditempel dapat membuat seluruh file menjadi tidak valid.
Paragraf yang merusak muatan
Paragraf yang merusak muatan — menempelkan pemisah baris yang terlihat ke dalam deskripsi yang dikutip akan menyisipkan karakter kontrol langsung ke dalam string JSON. Baris pertama terlihat lengkap, namun kutipan pembuka masih mengharapkan isi string atau kutipan penutup. Saat parser mencapai umpan baris mentah, parser berhenti di sana karena string JSON tidak dapat menjangkau garis fisik seperti itu. Teks harus berisi escape dua karakter `\n` di mana pun nilai yang didekode memerlukan baris baru.
Tab yang disalin dari dokumen atau spreadsheet menyebabkan jenis kegagalan yang sama, meskipun editor mungkin menjadikannya sebagai spasi yang tidak berbahaya. Ganti tab literal dengan `\t`, gerbong kembali dengan `\r` dan kontrol terlarang lainnya dengan pelolosan namanya atau Unicode.
Delapan lolos JSON memungkinkan
Delapan escape yang diperbolehkan oleh JSON — setelah garis miring terbalik, bentuk pendeknya adalah `"`, `\\`, `\/`, `\b`, `\f`, `\n`, `\r` dan `\t`. Mereka mewakili tanda kutip, garis miring terbalik, garis miring, spasi mundur, umpan formulir, umpan baris, kembalinya pengangkutan, dan tab horizontal. Garis miring mungkin juga tampak tidak lolos; `\/` ada terutama untuk kompatibilitas dengan konteks yang pernah memperlakukan urutan skrip penutup secara khusus.
Tidak ada huruf lain yang boleh mengikuti garis miring terbalik JSON. Urutan yang familiar dari bahasa pemrograman, seperti `\v`, `\0`, `\x41` atau garis miring terbalik yang diikuti dengan baris baru fisik, tidak valid di sini. Gunakan `\u` diikuti dengan tepat empat digit heksadesimal jika tidak ada short escape. Kosakata kecil yang tetap ini membuat string JSON tetap portabel: konsumen tidak memerlukan JavaScript, Python, atau aturan escape khusus shell untuk menentukan karakter yang diwakili oleh teks yang valid.
Mengapa tab literal tidak valid tetapi é literal baik-baik saja
Mengapa tab literal tidak valid tetapi é literal baik-baik saja — JSON melarang titik kode yang tidak lolos dari U+0000 hingga U+001F di dalam string. Rentang tersebut berisi tab, baris baru, dan kontrol lain yang efek tak terlihatnya dapat mengganggu pembingkaian atau tampilan. Huruf `é` adalah U+00E9, jauh di luar rentang kendali, jadi UTF-8 JSON dapat menyertakannya langsung di antara tanda kutip. Hal yang sama berlaku untuk sebagian besar skrip, simbol, dan emoji.
Oleh karena itu, keluar dari Unicode biasa bersifat opsional, bukan persyaratan kebersihan. `"café"` dan `"caf\u00e9"` mendekode ke urutan karakter yang sama. Teks langsung biasanya lebih mudah dibaca orang, sedangkan escape dapat membantu transportasi khusus ASCII atau membuat unit kode tertentu terlihat. Karakter kontrol berbeda: pelarian mereka adalah wajib.
Cara kerja \uXXXX escape
Cara kerja `\uXXXX` escape — `u` harus diikuti tepat oleh empat digit heksadesimal, menggunakan 0–9 atau A–F dalam kedua kasus tersebut. `\u00E9` mewakili unit kode UTF-16 untuk `é`, dan `\u000A` mewakili umpan baris. Digit yang lebih sedikit, kurung kurawal seperti `\u{1F600}` atau huruf non-heksadesimal membuat JSON tidak valid, meskipun bahasa pemrograman lain menerima notasi tersebut.
Karakter di atas U+FFFF direpresentasikan dalam bentuk escape ini sebagai pasangan pengganti. Emoji 😀 dapat ditulis sebagai `\uD83D\uDE00`: gabungan pengganti tinggi dan rendah setelah diurai menjadi satu nilai skalar Unicode. Tata bahasa JSON dapat membawa escape pengganti yang tidak berpasangan, namun pembuat enkode dan aplikasi hilir mungkin menolak atau menggantinya karena tidak mengidentifikasi karakter Unicode yang lengkap.
Contoh praktis: keluar dari jalur Windows dan cuplikan HTML
Contoh praktis: keluar dari jalur Windows dan cuplikan HTML — jalur yang dimaksudkan `C:\Temp\report.txt` memerlukan setiap garis miring terbalik dua kali lipat dalam JSON sumber: `"C:\\Temp\\report.txt"`. Tanpa penggandaan, `\T` adalah escape yang tidak valid dan urutan seperti `\r` atau `\t` dapat secara diam-diam menjadi karakter kontrol alih-alih pemisah jalur. Bangun JSON dari nilai yang diinginkan, bukan dengan menebak garis miring mana yang ditampilkan sudah termasuk dalam bahasa luar.
Fragmen HTML seperti `<a title="Report">Open</a>` boleh tetap menggunakan tanda kurung sudut dan garis miring, namun tanda kutip atribut harus menjadi `\"` di dalam string JSON. Jika baris baru memisahkan dua tag, enkodekan sebagai `\n`. Anggota JSON yang dihasilkan dapat divalidasi dan diurai kembali ke teks HTML asli.
Dimana pelarian menjadi dua kali lipat
Jika pelolosan menjadi dua kali lipat — setiap tata bahasa teks terlampir mendapat peluangnya sendiri untuk menafsirkan garis miring terbalik. Dokumen JSON berisi string yang didekodekan `line1\nline2` harus lolos dari garis miring terbalik tersebut, sehingga menghasilkan `"line1\\nline2"`. Jika teks JSON itu sendiri disimpan sebagai string JSON, tanda kutip dan kedua garis miring terbalik memerlukan lapisan pelolosan lain. Kekacauan yang tampak mencatat banyak representasi, bukan bentuk khusus JSON yang diperluas.
Shell dan literal bahasa pemrograman menambahkan aturan kutipannya sendiri sebelum parser JSON melihat argumennya. Diagnosis dari dalam ke luar: tulis nilai persis yang didekodekan terlebih dahulu, enkodekan sebagai JSON satu kali, lalu enkodekan teks JSON lengkap tersebut untuk shell atau bahasa sumber di sekitarnya. Di setiap batas, periksa byte atau karakter apa yang sebenarnya diterima parser berikutnya.
Hal ini tidak tercakup dalam hal ini
Yang tidak tercakup di sini — HTML entitas seperti `"` dan URL persen pengkodean seperti `%20` adalah transformasi terpisah untuk konteks sintaksis terpisah. Parser JSON tidak memecahkan kode bentuk mana pun. String `"""` berisi enam karakter literal setelah penguraian, bukan tanda kutip, dan `"%20"` berisi tanda persen diikuti oleh dua digit, bukan spasi. Terapkan pengkodean tersebut hanya ketika data melintasi komponen HTML atau URL.
Diskusi ini juga tidak menggantikan pengkodean keluaran. JSON valid yang diterima dari sumber tidak tepercaya masih dapat berisi HTML, teks seperti skrip, atau urutan kontrol terminal sebagai data string biasa. Aplikasi yang kemudian merender atau menjalankan perintah harus menangani tujuan tersebut dengan aman. JSON melarikan diri melindungi struktur JSON; ini bukan sanitasi universal.
Kesimpulan: lepas dari larangan tata bahasa, tidak lebih
Kesimpulan: hindari apa yang dilarang oleh tata bahasa, tidak lebih - tanda kutip ganda, garis miring terbalik, dan titik kode di bawah U+0020 memerlukan perhatian di dalam string JSON. Unicode biasa tetap dapat dibaca, sementara `\uXXXX` memberikan alternatif empat digit yang tepat dan pasangan pengganti mewakili karakter di atas U+FFFF. Diagnostik pada posisi yang tampaknya kosong sering kali mengidentifikasi baris baru literal, tab, atau karakter kontrol lainnya yang harus diganti dengan escape tekstualnya.
Hitung lapisan pengkodean alih-alih menghitung garis miring secara langsung. Mulai dari nilai yang harus diterima aplikasi, enkodekan sekali untuk JSON dan baru kemudian kutip dokumen yang dihasilkan untuk kulit terluar, file sumber, atau string JSON kedua. Validasi teks yang disajikan ke parser JSON dan, jika kebenarannya penting, periksa string yang didekodekan sesudahnya.