JSON (JavaScript Object Notation) adalah format berbasis teks yang ringan untuk menyimpan dan menukar data terstruktur, dibangun dari objek berisi pasangan key/value, array berurutan, dan beberapa tipe nilai: string, angka, true, false, dan null. JSON menjadi format default untuk API web dan banyak file konfigurasi karena mudah dibaca manusia dan sederhana untuk di-parse oleh semua bahasa pemrograman. JSON bersifat ketat: key dan string wajib memakai tanda kutip ganda, sedangkan koma di akhir dan komentar tidak diperbolehkan.
- JSON memiliki tepat enam jenis nilai: objek, array, string, angka, boolean (
true/false), dannull. - Key harus berupa string dalam tanda kutip ganda; tanda kutip tunggal tidak pernah valid.
- Tidak boleh ada koma di akhir, komentar,
undefined,NaN, atauInfinity. - Sebagian besar error "invalid JSON" disebabkan oleh koma yang hilang atau berlebih, tanda kutip yang salah, atau karakter dalam string yang tidak di-escape.
- Validasi sintaks dulu dengan parser yang ketat, lalu validasi struktur dengan JSON Schema jika diperlukan.
Seperti apa tampilan JSON
JSON berkembang dari sintaks yang dipakai JavaScript untuk object literal, tetapi tidak terikat pada bahasa tertentu. JSON didefinisikan dalam RFC 8259 dan standar ECMA-404, dan ringkasan satu halaman di json.org menjelaskan seluruh tata bahasanya. Dokumen JSON yang umum terlihat seperti ini:
{
"id": 1042,
"name": "Ada Lovelace",
"email": "ada@example.com",
"active": true,
"score": 98.5,
"manager": null,
"roles": ["admin", "editor"],
"address": {
"city": "London",
"postcode": "N1 9GU"
}
}
Spasi di antara elemen (spasi, tab, dan baris baru) diabaikan, sehingga data yang sama bisa ditulis dalam satu baris atau dibentangkan dengan indentasi. Tingkat teratas dokumen JSON dapat berupa nilai apa pun, meskipun API hampir selalu memakai objek atau array.
Tipe data JSON
| Tipe | Contoh | Aturan |
|---|---|---|
| Objek | {"a": 1, "b": 2} | Kumpulan pasangan key/value yang tidak berurutan dalam kurung kurawal. Key berupa string; titik dua memisahkan key dan value; koma memisahkan antarpasangan. |
| Array | [1, "two", false] | Daftar nilai berurutan dalam kurung siku, dipisahkan dengan koma. Nilainya boleh bertipe campuran. |
| String | "caf\u00e9 \"quoted\"" | Hanya tanda kutip ganda. Escape dengan backslash: \" \\ \/ \b \f \n \r \t dan \uXXXX. Baris baru dan tab mentah di dalam string tidak diperbolehkan. |
| Angka | -12, 3.14, 6.02e23 | Hanya desimal. Tanpa + di depan, tanpa nol di depan (07), tanpa heksadesimal, tanpa NaN atau Infinity. Titik desimal harus memiliki angka di kedua sisinya. |
| Boolean | true, false | Huruf kecil, tanpa tanda kutip. |
| Null | null | Huruf kecil, tanpa tanda kutip. Mewakili nilai kosong atau tidak diketahui. |
JSON tidak memiliki tipe tanggal. Tanggal biasanya ditulis sebagai string dalam format ISO 8601, seperti "2026-10-13T09:30:00Z", atau sebagai Unix timestamp berupa angka; Konverter Unix Timestamp kami dapat mengubah keduanya bolak-balik.
Angka dan presisi
Standar JSON tidak membatasi ukuran atau presisi angka, tetapi program yang membacanya punya batas. JavaScript menyimpan angka sebagai nilai floating point 64-bit, sehingga bilangan bulat yang lebih besar dari 9.007.199.254.740.991 (253 − 1) bisa kehilangan presisi tanpa peringatan. Untuk ID yang besar, banyak API mengirimkannya sebagai string, misalnya "id": "1234567890123456789".
Aturan yang sering membuat orang tersandung
JSON mirip dengan JavaScript, dictionary Python, dan YAML, dan itulah sebabnya orang tanpa sengaja menulis JSON yang tidak valid. Aturan berikut tidak punya pengecualian dalam JSON standar:
- Key harus berupa string dalam tanda kutip ganda.
{name: "Ada"}valid dalam JavaScript tetapi tidak valid sebagai JSON; tulis{"name": "Ada"}. - Hanya tanda kutip ganda.
'Ada'bukan string JSON. - Tanpa koma di akhir.
[1, 2, 3,]dan{"a": 1,}tidak valid. - Tanpa komentar. Baik
// ...maupun/* ... */tidak diperbolehkan. - Nilai literal berhuruf kecil.
True,FALSE, danNone(penulisan di Python) tidak valid; gunakantrue,false, dannull. - Tanpa
undefined, fungsi, atau angka khusus. Semuanya ada di JavaScript tetapi tidak punya padanan di JSON. - Key sebaiknya unik. Standar menyebutkan bahwa nama dalam satu objek sebaiknya unik; jika ada duplikat, perilaku parser berbeda-beda, dan banyak yang diam-diam hanya menyimpan yang terakhir.
Beberapa tool menerima varian yang lebih longgar. File seperti settings.json di VS Code dan tsconfig.json di TypeScript dibaca dengan parser yang mengizinkan komentar (sering disebut JSONC), dan JSON5 mengizinkan komentar, tanda kutip tunggal, dan koma di akhir. Itu adalah format tersendiri: parser JSON standar, termasuk yang dipakai klien API atau server Anda, akan menolaknya.
Error JSON yang umum dan cara memperbaikinya
Bunyi pesan error berbeda-beda di tiap parser. Tabel ini menunjukkan jenis pesan yang akan Anda lihat dari modul json Python atau JSON.parse di browser, arti yang biasanya terkandung, dan perbaikannya. Posisi yang dilaporkan sering menunjuk tepat setelah kesalahan sebenarnya, jadi periksa juga karakter sebelumnya.
| Masalah | Pesan error yang umum | Perbaikan |
|---|---|---|
Koma di akhir: {"a": 1,} | "Expecting property name enclosed in double quotes" atau "Unexpected token }" | Hapus koma setelah item terakhir di objek atau array. |
Key tanpa tanda kutip atau dengan kutip tunggal: {a: 1}, {'a': 1} | "Expecting property name enclosed in double quotes" atau "Expected double-quoted property name" | Apit setiap key dengan tanda kutip ganda. |
Nilai string dengan kutip tunggal: {"a": 'x'} | "Expecting value" atau "Unexpected token '" | Gunakan tanda kutip ganda, dan escape tanda kutip ganda di dalamnya sebagai \". |
| Koma hilang di antara item | "Expecting ',' delimiter" atau "Expected ',' or '}' after property value" | Tambahkan koma di antara dua nilai atau pasangan pada baris yang dilaporkan. |
| Komentar di dalam file | "Expecting value" atau "Unexpected token /" | Hapus komentar, atau pindahkan catatan itu ke field data seperti "_comment". |
Literal Python atau JavaScript: True, None, undefined, NaN | "Expecting value" atau "Unexpected token" | Gunakan true, false, atau null; serialisasikan data dengan library JSON yang sebenarnya, bukan dengan mencetaknya. |
| Baris baru atau tab mentah di dalam string | "Invalid control character" atau "Bad control character in string literal" | Ganti dengan \n atau \t. |
Backslash yang tidak di-escape, seperti path Windows "C:\new" | "Invalid \escape" atau "Bad escaped character" | Gandakan backslash-nya: "C:\\new". |
| Kurung atau tanda kutip penutup hilang | "Unterminated string" atau "Unexpected end of JSON input" | Pastikan setiap {, [, dan " sudah ditutup; indentasi dari formatter membuat bagian yang kosong mudah terlihat. |
| Dua dokumen berurutan, atau ada teks setelah akhir dokumen | "Extra data" atau "Unexpected non-whitespace character after JSON" | Bungkus beberapa objek dalam sebuah array, atau proses input sebagai JSON Lines (satu dokumen per baris). |
| Respons kosong atau halaman error HTML yang di-parse sebagai JSON | "Expecting value: line 1 column 1" atau "Unexpected token <" | Periksa status HTTP dan isi respons; server mengembalikan sesuatu selain JSON. |
Baris terakhir adalah salah satu yang paling sering terjadi dalam praktik: kode memanggil JSON.parse atau response.json() pada halaman error yang diawali <!DOCTYPE html>, dan < dilaporkan sebagai token tak terduga.
JSON vs YAML vs XML
| JSON | YAML | XML | |
|---|---|---|---|
| Struktur | Kurung kurawal dan kurung siku | Indentasi | Tag pembuka dan penutup |
| Komentar | Tidak | Ya (#) | Ya (<!-- -->) |
| Tipe data | String, angka, boolean, null, objek, array | Serupa, ditambah tanggal dan tipe lain tergantung parser | Semuanya teks kecuali skema menetapkan tipe |
| Atribut dan konten campuran | Tidak | Tidak | Ya |
| Keringkasan | Ringkas | Paling ringkas dibaca | Paling panjang |
| Kegunaan umum | API web, penyimpanan browser, manifes paket, log | Konfigurasi: Kubernetes, Docker Compose, pipeline CI | Dokumen, SOAP, RSS dan Atom, sitemap, format file office |
| Kelemahan utama | Aturan kutip dan koma yang ketat | Peka terhadap spasi; beberapa nilai tanpa kutip ditafsirkan di luar dugaan | Bertele-tele; namespace dan entity menambah kerumitan |
YAML 1.2 dirancang agar dokumen JSON, kecuali pada kasus tepi yang jarang, juga merupakan YAML yang valid, sehingga konversi di antara keduanya mudah dilakukan. Konverter JSON ↔ YAML kami menangani kedua arah, YAML Formatter & Validator dan XML Formatter & Validator memvalidasi dua format lainnya, dan Konverter CSV ↔ JSON mengubah ekspor spreadsheet menjadi array objek.
Pretty-print dan minify
Karena spasi tidak berpengaruh, JSON yang sama bisa diformat untuk manusia atau untuk mesin:
- JSON pretty-printed menambahkan baris baru dan indentasi, biasanya dua atau empat spasi, sehingga tingkat penyarangan terlihat. Gunakan untuk file konfigurasi, dokumentasi, dan debugging.
- JSON minified membuang semua spasi opsional agar payload lebih kecil. Gunakan untuk data yang dikirim lewat jaringan atau disimpan dalam jumlah besar; kompresi HTTP juga mengecilkan ukuran, jadi penghematannya sering kecil.
{"name":"Ada","roles":["admin","editor"],"active":true}
Kebanyakan bahasa pemrograman dapat melakukan keduanya. Di JavaScript, JSON.stringify(data, null, 2) melakukan pretty-print dengan indentasi dua spasi dan JSON.stringify(data) melakukan minify. Di Python, json.dumps(data, indent=2) melakukan pretty-print dan json.dumps(data, separators=(",", ":")) menghasilkan output paling ringkas.
Cara memvalidasi JSON
Validasi JSON punya dua tingkat: apakah teksnya valid secara sintaks sebagai JSON, dan apakah strukturnya sesuai dengan yang diharapkan aplikasi Anda.
- Periksa sintaks dengan parser yang ketat. Tempel teks ke JSON Formatter & Validator kami, yang melaporkan baris dan kolom error pertama dan berjalan di browser Anda. Di command line,
python3 -m json.tool data.jsonataujq . data.jsonmenampilkan dokumen yang sudah diformat atau pesan error. - Perbaiki error satu per satu. Parser berhenti pada masalah pertama, jadi jalankan ulang setelah setiap perbaikan sampai berhasil.
- Periksa strukturnya. Pastikan field wajib ada dan bertipe benar, baik lewat kode maupun dengan validator JSON Schema.
- Periksa encoding-nya. JSON yang dipertukarkan antarsistem sebaiknya berencoding UTF-8. File yang disimpan dengan encoding lain bisa menghasilkan karakter aneh atau error pada teks non-Inggris.
Sekilas tentang JSON Schema
JSON Schema adalah kosakata, yang ditulis dalam JSON itu sendiri, untuk menggambarkan seperti apa dokumen yang valid: properti mana yang wajib, tipe tiap properti, nilai yang diizinkan, pola string, rentang angka, dan seterusnya. Validator tersedia untuk sebagian besar bahasa, dan format deskripsi API seperti OpenAPI memakai JSON Schema untuk menjelaskan isi request dan response. Spesifikasinya dipublikasikan di json-schema.org. Contoh singkat:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["id", "email"],
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"roles": { "type": "array", "items": { "type": "string" } }
}
}
Dokumen tanpa email atau dengan id berupa string tetap merupakan JSON yang valid, tetapi tidak lolos skema ini. Perlu diingat bahwa banyak validator memperlakukan format sebagai anotasi dan tidak menegakkannya kecuali dikonfigurasi.
Pertanyaan yang sering diajukan
Bisakah JSON memiliki komentar?
Tidak. JSON standar tidak mengizinkan komentar dalam bentuk apa pun. Beberapa tool menerima JSONC atau JSON5 yang mengizinkannya, tetapi file yang akan dibaca program lain sebaiknya tetap memakai JSON biasa. Jika perlu catatan, tambahkan field seperti "_comment".
Mengapa JSON tidak mengizinkan koma di akhir?
Tata bahasanya sengaja dibuat sangat minimal dan memang tidak memuatnya. Banyak engine JavaScript dan bahasa lain menerima koma di akhir dalam sintaksnya sendiri, itulah sebabnya koma semacam itu sering muncul secara keliru di JSON yang ditulis manual.
Apa perbedaan JSON dengan objek JavaScript?
JSON adalah format teks; objek JavaScript adalah struktur data di memori. Sintaks JSON adalah subset yang lebih ketat dari sintaks literal JavaScript. Anda mengonversi di antara keduanya dengan JSON.parse dan JSON.stringify.
Apa arti "Unexpected token < in JSON at position 0"?
Teks yang di-parse diawali dengan <, yang hampir selalu berarti Anda menerima HTML, seperti halaman error atau halaman login, bukan JSON. Periksa URL request, kode status HTTP, dan isi respons mentahnya.
Apakah urutan key dalam objek JSON dipertahankan?
Standar memperlakukan objek sebagai tidak berurutan, jadi Anda sebaiknya tidak bergantung pada urutan key. Dalam praktiknya sebagian besar parser modern mempertahankan urutan yang dibaca, tetapi urutan array adalah satu-satunya urutan yang dijamin JSON.
Ekstensi file dan tipe MIME apa yang dipakai JSON?
File memakai ekstensi .json dan media type-nya adalah application/json, sebagaimana terdaftar dalam RFC 8259.