Skip to content
Kembali ke Blog
Tutorial

Cara Escape String JSON: Karakter, Stringify, dan Jebakan

Cara escape string di JSON: karakter mana yang perlu di-escape, perbedaannya dengan JSON.stringify, penyarangan JSON-dalam-JSON, escape Unicode, dan jebakan umum.

9 menit membaca

Cara Escape String JSON: Karakter, Stringify, dan Jebakan

Melakukan escape pada string JSON berarti mengubah teks sembarang menjadi string yang bisa diletakkan dengan aman di dalam dokumen JSON sebagai literal string. Segelintir karakter (tanda kutip ganda, backslash, dan karakter kontrol seperti newline dan tab) membawa makna struktural atau memang ilegal di dalam string JSON, sehingga masing-masing diganti dengan urutan escape yang aman seperti \", \\, atau \n. Salah melakukannya, maka payload Anda berhenti bisa di-parse.

Anda menghadapi ini terus-menerus: menyarangkan satu objek JSON di dalam objek lain sebagai field string, menempelkan potongan kode multi-baris ke dalam nilai konfigurasi, atau menyusun sendiri body permintaan REST untuk curl. Panduan ini membahas persisnya karakter mana yang perlu di-escape, menjernihkan kebingungan antara escape dan JSON.stringify, menelusuri penyarangan JSON-dalam-JSON dan escape Unicode, serta mendaftar jebakan yang diam-diam merusak payload. Jika Anda hanya ingin meng-escape sesuatu sekarang juga, alat JSON Escape kami melakukannya di browser, tetapi baca terus untuk memahami mengapa ia bekerja seperti itu.

Apa Itu Escape String JSON?

Escape string JSON adalah proses mengubah string mentah menjadi bentuk yang aman untuk disisipkan ke dalam dokumen JSON. JSON mencadangkan sehimpun kecil karakter yang membawa makna struktural: tanda kutip ganda " membatasi sebuah string, dan backslash \ memulai sebuah urutan escape. Di samping itu, karakter kontrol di bawah U+0020 seperti newline, tab, dan carriage return sama sekali tidak boleh muncul secara harfiah di dalam string JSON. Escape mengganti masing-masing dengan urutan aman sehingga string yang dihasilkan bisa di-parse dengan bersih di mana saja.

Kapan Anda benar-benar membutuhkannya? Beberapa situasi muncul berulang kali:

  • JSON-dalam-JSON: sebuah envelope webhook, pesan Kafka, atau log audit menyimpan body permintaan sebagai field string, sehingga JSON di dalamnya harus di-escape sebelum bisa ditugaskan.
  • Konfigurasi tulis tangan: menjatuhkan skrip shell multi-baris, kueri SQL, atau potongan kode ke dalam satu nilai JSON berarti mengubah setiap newline menjadi \n.
  • Body permintaan REST: menyusun body JSON dengan tangan untuk curl atau klien HTTP, di mana tanda kutip dan newline harus selamat melewati shell dan jaringan.
  • Pengkodean aman-log: menulis konten dari pengguna ke dalam baris log terstruktur tanpa membiarkan tanda kutip atau newline yang disisipkan merusak format.

Sepatah kata tentang urutan operasi. Jika Anda mulai dari JSON yang berantakan atau tidak tepercaya, validasi dulu agar yang Anda escape sudah berbentuk benar. Tempelkan ke JSON Formatter untuk mempercantik dan memeriksanya, lalu escape hasil yang bersih itu. Meng-escape sampah hanya memberi Anda sampah yang ter-escape.

Karakter Mana yang Harus Di-escape di JSON

Spesifikasi JSON mendefinisikan daftar yang ringkas dan presisi. Tujuh karakter punya escape dua-karakter khusus, dan segala sesuatu lain di bawah U+0020 jatuh ke escape Unicode \uXXXX. Berikut himpunan lengkap karakter escape JSON:

KarakterDi-escape menjadiCatatan
" (U+0022)\"Pembatas string
\ (U+005C)\\Pembuka escape (kasus json escape backslash)
newline (U+000A)\n
carriage return (U+000D)\r
tab (U+0009)\t
backspace (U+0008)\b
form feed (U+000C)\f
kontrol lain < U+0020\uXXXXmis. U+0000 → \u0000

Apa yang tidak perlu di-escape sama pentingnya. Garis miring depan / adalah karakter yang sepenuhnya normal (meng-escape-nya bersifat opsional, dan hanya berguna dalam satu kasus sempit yang dibahas di bawah). Tanda kutip tunggal tidak pernah perlu di-escape karena JSON tidak memakainya sebagai pembatas. Dan setiap karakter cetak pada atau di atas U+0020, termasuk semua karakter UTF-8 multi-byte seperti é, , atau 😀, valid apa adanya.

Berikut perbedaannya dibuat konkret. Input mentah di kiri, literal string JSON yang ter-escape di kanan:

Input:
She said "hello"	then left.

Escaped:
"She said \"hello\"\tthen left."

Tanda kutip ganda menjadi \" dan tab menjadi \t. Kini string itu aman untuk dijatuhkan ke parser JSON, baris log, atau body permintaan mana pun.

JSON Escape vs JSON Stringify: Apa Bedanya?

Kebanyakan tutorial melewatkan titik ini, dan ia membingungkan banyak orang. Escape dan JSON.stringify bukanlah dua operasi berbeda; keduanya adalah dua sudut pandang atas operasi yang sama.

JSON.stringify(value) menserialisasi nilai JavaScript mana pun menjadi representasi teks JSON-nya. Ketika nilai itu kebetulan berupa string, menserialisasinya berarti membungkusnya dalam tanda kutip ganda dan meng-escape karakter spesial di dalamnya. Itu persis escape JSON. Jadi JSON.stringify("a\tb") mengembalikan string tujuh-karakter "a\tb", termasuk tanda kutip.

Pertanyaan praktisnya adalah apakah Anda menginginkan tanda kutip terluar itu. Itu langsung memetakan ke opsi Wrap in double quotes di alat JSON Escape:

ModeOutput untuk input a"bKapan memakainya
Wrap on"a\"b"Literal string JSON yang lengkap, identik dengan JSON.stringify. Tugaskan ke variabel atau tempel setelah titik dua.
Wrap offa\"bHanya body yang ter-escape, tanpa tanda kutip di sekelilingnya. Pakai saat Anda mengetik sendiri tanda kutipnya di dalam dokumen JSON.

Jadi jika Anda mencari “json stringify” dan mendarat di sini, aturannya sederhana: stringify sebuah string = escape dengan wrap-on. Bentuk tanpa-kutip adalah hal yang sama dengan tanda kutip terluar dikupas.

Cara Escape String untuk JSON dalam Kode

Aturan emasnya: jangan pernah menyusun sendiri rantai pemanggilan replace(). Setiap bahasa arus utama menyertakan serializer JSON yang menangani tanda kutip, backslash, karakter kontrol, dan Unicode dengan benar. Gunakan itu.

JavaScript

const text = 'She said "hi"\nthen left.';
const escaped = JSON.stringify(text);
console.log(escaped);
// "She said \"hi\"\nthen left."

JSON.stringify pada sebuah string memberi Anda literal yang lengkap dan berkutip. Mau hanya body-nya? Iris karakter pertama dan terakhir: JSON.stringify(text).slice(1, -1).

Python

import json

text = 'She said "hi"\nthen left.'
print(json.dumps(text))
# "She said \"hi\"\nthen left."

print(json.dumps(text, ensure_ascii=False))
# "She said \"hi\"\nthen left."  (non-ASCII dipertahankan sebagai UTF-8)

json.dumps secara default ensure_ascii=True, yang meng-escape setiap karakter non-ASCII ke \uXXXX, perilaku yang sama dengan mode ASCII-safe pada alat. Berikan ensure_ascii=False untuk mempertahankan UTF-8 mentah.

PHP

<?php
$text = "café \"quoted\"\nline";
echo json_encode($text);
// "caf\u00e9 \"quoted\"\nline"  (secara default meng-escape non-ASCII ke \uXXXX)

echo json_encode($text, JSON_UNESCAPED_UNICODE);
// "café \"quoted\"\nline"

json_encode meng-escape baik karakter non-ASCII maupun garis miring depan secara default. Tambahkan JSON_UNESCAPED_UNICODE untuk menjaga aksen tetap terbaca, dan JSON_UNESCAPED_SLASHES untuk membiarkan / apa adanya.

Go dan Java

Di Go, json.Marshal(text) mengembalikan byte yang ter-escape dan berkutip:

b, _ := json.Marshal(`a "quoted" line`)
// b == `"a \"quoted\" line"`

Di Java, objectMapper.writeValueAsString(text) milik Jackson atau JSONObject.quote(text) milik org.json menghasilkan literal berkutip yang sama. Apa pun bahasanya, sandarkan pada pustaka, karena ia sudah mengetahui setiap kasus tepi yang akan Anda lupakan.

Menyematkan JSON di Dalam JSON (JSON-dalam-JSON)

Ini alasan paling umum orang meng-escape JSON dengan tangan. Sebuah envelope webhook, rekaman antrean-pesan, atau log audit sering menyimpan seluruh body permintaan sebagai field string. Untuk melakukannya, JSON di dalamnya harus di-escape lebih dulu.

Amati sebuah objek kecil melintasi dua lapis pengkodean:

1. Objek dalam:         {"a":1}
2. Di-escape jadi string: "{\"a\":1}"
3. Ditaruh di envelope: {"payload": "{\"a\":1}"}

Setiap " di objek dalam menjadi \", dan keseluruhannya dibungkus dalam satu pasang tanda kutip terluar. Hasilnya adalah satu nilai string valid yang bisa Anda tugaskan ke payload.

Jebakan penyarangan yang lebih dalam adalah backslash berlipat. Meng-escape string yang sudah ter-escape juga meng-escape backslash-nya, sehingga setiap lapis kira-kira melipatgandakannya: sebuah tanda kutip dalam yang tadinya \" menjadi \\\" satu tingkat ke luar, dan \\\\\" satu tingkat lagi. JSON-dalam-JSON tiga-tingkat sulit dibaca, dan di situlah sebuah alat membantu. Untuk menempuh arah sebaliknya dan menarik objek dalam keluar dari string, jalankan melalui alat JSON Unescape kami.

Unicode dan Escape \uXXXX

Secara default, JSON senang dengan UTF-8 mentah. Sebuah é tetap é, sebuah tetap , dan dokumennya lebih terbaca karenanya. Anda tidak perlu meng-escape karakter Unicode cetak mana pun.

Jadi kapan Anda seharusnya meraih output ASCII-safe \uXXXX? Hanya ketika sistem hilir tidak bisa dipercaya dengan UTF-8: gerbang SOAP atau XML lama, jalur logging tertentu, header email, atau berkas sumber yang harus tetap murni ASCII. Dalam mode ASCII-safe, setiap karakter di atas U+007F menjadi escape \uXXXX, sehingga café berubah menjadi caf\u00e9. Ia lebih berisik tetapi murni byte-demi-byte ASCII, dan ia ter-decode kembali ke aslinya di parser mana pun yang patuh.

Ada satu kehalusan. \uXXXX mengkodekan satu unit kode UTF-16 16-bit, tetapi karakter di luar Basic Multilingual Plane seperti emoji dan aksara langka memerlukan 21 bit. JSON menanganinya dengan pasangan surrogate: dua escape \uXXXX berturut-turut. Wajah menyeringai 😀 (U+1F600) menjadi \ud83d\ude00. Sebagian besar serializer melakukannya untuk Anda; bahayanya adalah escaper tulis-tangan yang memancarkan satu surrogate tunggal yang tak berpasangan.

Jika pasangan surrogate dan titik kode masih wilayah baru, Panduan UTF-8 vs UTF-16 vs Unicode menguraikan persisnya bagaimana satu karakter memetakan ke byte dan unit kode. Itulah konteks yang hilang di balik mengapa satu emoji membutuhkan dua escape.

Unescape: Membaca Kembali JSON yang Ter-escape

Escape punya kebalikan. Untuk mengubah "a\tb" kembali menjadi teks dua-baris-atau-bertab yang sebenarnya, Anda mem-parse-nya: JSON.parse(str) di JavaScript, json.loads(str) di Python. Parser menelusuri setiap urutan escape dan membangun ulang karakter aslinya, termasuk pasangan surrogate.

Ketika unescape gagal, error-nya hampir selalu “invalid escape sequence”, dan ada beberapa penyebab lazim:

  • Sebuah backslash tunggal sebelum karakter yang tidak dikenali JSON sebagai escape, seperti \q.
  • Sebuah escape yang dikarang seperti \x41 — JSON tidak punya escape heksa \x; ia hanya memakai \u.
  • Sebuah escape \u yang terpotong dengan kurang dari empat digit heksa, seperti \u00.
  • Sebuah tanda kutip ganda yang menyimpang atau tidak seimbang yang merusak batas string.

Periksa bahwa setiap backslash memulai salah satu escape valid (\n \r \t \b \f \" \\ \/ \uXXXX) dan tanda kutip berpasangan. Untuk string ter-escape yang disalin dari tengah baris log, di mana tanda kutip terluar tertinggal, alat JSON Unescape kami menerima body dengan atau tanpa tanda kutip di sekelilingnya dan men-decode-nya bagaimanapun caranya.

Jebakan Umum Escape JSON

Sebagian besar payload rusak berakar pada salah satu dari enam kesalahan ini.

1. Escape ganda. Meng-escape teks yang sudah ter-escape mengubah \n menjadi \\n dan \" menjadi \\\", sehingga konsumen membaca backslash-n harfiah alih-alih sebuah newline. Ini biasanya terjadi saat sebuah layanan hulu sudah meng-escape-JSON nilai itu dan Anda meng-escape-nya lagi. Unescape dulu untuk memeriksa keadaan saat ini, lalu escape tepat sekali.

2. Lupa tanda kutip terluar. Dengan wrap mati Anda hanya mendapat body yang ter-escape, bukan string lengkap. Menempelkan hello \"world\" langsung ke tempat yang mengharapkan nilai JSON itu tidak valid karena tanda kutip di sekelilingnya hilang. Entah biarkan wrap hidup atau ketik sendiri tanda kutipnya.

3. Escape berlebihan pada non-ASCII. Menyalakan mode ASCII-safe ketika konsumen menangani UTF-8 dengan baik hanya menggelembungkan output. café menjadi caf\u00e9 tanpa alasan: lebih sulit dibaca, lebih besar di jaringan, tanpa manfaat. Biarkan mati kecuali sistem warisan tertentu menuntut murni ASCII.

4. Escape garis miring depan secara refleks. Escape / penting di tepat satu tempat: JSON yang disisipkan di dalam tag HTML &lt;script&gt;, di mana substring &lt;/script&gt; akan menutup tag terlalu dini terlepas dari konteks JSON. Meng-escape / menjadi \/ menetralkannya. Di luar satu kasus itu, meng-escape garis miring murni kekacauan, jadi biarkan mati untuk body REST, berkas konfigurasi, dan payload pesan.

5. Rantai replace susunan tangan. Pipeline manual replace('"', '\\"') hampir selalu melupakan sesuatu, entah sebuah karakter kontrol, sebuah backspace, atau sebuah pasangan surrogate. Gunakan serializer bahasa tersebut, yang mencakup seluruh spesifikasi.

6. Escape tapi tak pernah unescape (atau unescape dua kali). Sebuah round-trip harus seimbang. Escape sekali saat masuk, unescape sekali saat keluar. Unescape dua kali dan Anda merusak backslash sebenarnya yang merupakan bagian dari data.

Satu pembedaan lagi yang penting: escape JSON bukan pengkodean URL atau persen. Keduanya menyelesaikan masalah berbeda untuk transport berbeda, dan mencampurnya, misalnya mengkodekan-persen sebuah nilai lalu meng-escape-JSON hasilnya atau sebaliknya, menghasilkan kekacauan yang tak bisa dibaca bersih oleh parser mana pun. Panduan URL Encoding & Decoding membahas kapan pengkodean-persen adalah alat yang tepat dan bagaimana ia berbeda dari yang dilakukan JSON.

Pertanyaan yang Sering Diajukan

Apa artinya escape string di JSON?

Artinya mengganti karakter yang membawa makna struktural bagi JSON (tanda kutip ganda, backslash, dan karakter kontrol seperti newline dan tab) dengan urutan escape yang aman seperti \", \\, dan \n. Hasilnya bisa disematkan sebagai literal string di dalam dokumen JSON tanpa merusak parse.

Karakter apa saja yang perlu di-escape di JSON?

Tanda kutip ganda, backslash, newline, carriage return, tab, backspace, dan form feed masing-masing mendapat escape khusus, dan setiap karakter kontrol lain di bawah U+0020 menjadi \uXXXX. Karakter cetak dan UTF-8 multi-byte tidak perlu di-escape; garis miring depan bersifat opsional dan hanya penting di dalam tag HTML &lt;script&gt;.

Apakah JSON escape sama dengan JSON.stringify?

Sebagian besar dua sudut pandang atas satu operasi. JSON.stringify yang diterapkan ke sebuah string membungkusnya dalam tanda kutip ganda dan meng-escape karakter spesial di dalamnya, dan itulah escape JSON. Wrap on sama dengan bentuk berkutip (identik dengan JSON.stringify); wrap off memberi Anda hanya body yang ter-escape tanpa tanda kutip di sekelilingnya.

Bagaimana cara escape string untuk JSON di JavaScript atau Python?

Di JavaScript gunakan JSON.stringify(str); di Python gunakan json.dumps(str). Selalu sandarkan pada fungsi bawaan alih-alih rantai replace tulis-tangan — fungsi bawaan menangani Unicode, karakter kontrol, dan setiap kasus tepi yang jika tidak akan Anda lewatkan, dengan benar.

Mengapa JSON saya rusak dengan backslash berlebih?

Penyebab lazimnya adalah escape ganda: meng-escape teks yang sudah ter-escape, sehingga \n menjadi \\n dan konsumen membaca backslash-n harfiah alih-alih sebuah newline. Unescape nilai itu dulu untuk memeriksa keadaan sebenarnya, lalu escape tepat sekali.

Apakah saya perlu escape garis miring depan atau Unicode di JSON?

Keduanya tidak diperlukan. / adalah karakter normal dan hanya perlu di-escape saat Anda menyisipkan JSON ke dalam tag HTML &lt;script&gt;, untuk mencegah urutan &lt;/script&gt; menutupnya terlalu dini. Unicode tetap sebagai UTF-8 mentah secara default; gunakan \uXXXX hanya ketika sistem hilir tidak bisa menangani UTF-8.

Tag: JSON Encoding Data Formats JavaScript

Artikel Terkait

Lihat semua artikel