JSON (JavaScript Object Notation) adalah format teks untuk mengirim data. Hampir semua API web memakainya, termasuk API Toko Buku. Bentuknya mirip object JavaScript, tapi aturannya jauh lebih ketat. Bayangin formulir resmi: tiap isian punya label yang ditulis persis, dan kalau satu tanda saja salah, petugasnya menolak seluruh formulir. JSON.parse adalah petugas itu.
🧪 Tebakan cepat:
{"title": "Laskar Pelangi", "price": 89000,}itu sah, atau ditolak? Tebak dulu, jawabannya ada di bagian "Aturan yang bikin JSON.parse menolak".
Enam jenis nilai
Ini body GET /books/1 versi lengkap dari API Toko Buku:
{
"id": 1,
"title": "Laskar Pelangi",
"price": 89000,
"in_stock": true,
"discount": null,
"tags": ["novel", "pendidikan"],
"author": { "id": 1, "name": "Andrea Hirata" }
}
| Jenis | Contoh | Catatan |
|---|---|---|
| string | "Laskar Pelangi" |
selalu kutip ganda |
| number | 89000, 4.5 |
tanpa kutip, tanpa titik ribuan, desimal pakai titik |
| boolean | true, false |
huruf kecil |
| null | null |
sengaja kosong |
| array | ["novel", "pendidikan"] |
daftar berurutan, pakai [ ] |
| object | {"id": 1, "name": "Andrea Hirata"} |
pasangan key dan nilai, pakai { } |
Nilai boleh berisi nilai lain. tags adalah array di dalam object, author adalah object di dalam object. Data yang bersarang (nested) seperti ini yang diminta latihan.
Aturan yang bikin JSON.parse menolak
- Key wajib kutip ganda:
{"title": ...}, bukan{title: ...}. - String wajib kutip ganda:
"Budi", bukan'Budi'. - Gak boleh ada koma setelah isi terakhir (trailing comma).
- Gak boleh ada komentar
//atau/* */. - Gak ada
undefined,NaN, atau function. Yang kosong ditulisnull. - Angka gak boleh diawali nol.
08123456789ditolak, jadi nomor HP ditulis sebagai string.
Jadi {"title": "Laskar Pelangi", "price": 89000,} ditolak, karena ada koma setelah 89000. Itu jawaban tebakannya. Chrome menulis alasannya begini:
SyntaxError: Expected double-quoted property name in JSON at position 43 (line 1 column 44)
Setelah koma, JSON.parse menunggu key baru dalam kutip ganda, tapi di posisi 43 yang datang }. Firefox dan Safari menulis pesannya dengan kata lain, tapi sama-sama menolak.
| JSON | Masalahnya |
|---|---|
{nama: "Budi", umur: 17} |
key harus pakai kutip |
{"nama": "Budi", "umur": 17,} |
koma terakhir |
{"nama": 'Budi', "umur": 17} |
string pakai kutip tunggal |
Object JavaScript bukan JSON
Di kode JavaScript, object boleh ditulis santai: key tanpa kutip, kutip tunggal, koma terakhir. JSON adalah teks yang dikirim lewat jaringan. Dua function bawaan menjembatani keduanya:
const book = { title: 'Laskar Pelangi', price: 89000, discount: undefined };
const text = JSON.stringify(book);
console.log(text); // {"title":"Laskar Pelangi","price":89000}
const back = JSON.parse(text);
console.log(back.price); // 89000
JSON.stringifymengubah object jadi teks JSON: semua key dan string dapat kutip ganda.- Field yang isinya
undefineddibuang, karena JSON gak kenalundefined. JSON.parsemengubah teks JSON jadi object lagi.
res.json(object) di Express memanggil JSON.stringify untukmu. Itu sebabnya di latihan kamu boleh menulis key tanpa kutip: yang kamu tulis object JavaScript, yang terkirim JSON.
Header Content-Type: application/json
Body JSON selalu ditemani header Content-Type: application/json, baik di request maupun di response. Header itu bilang "isi body ini JSON, baca pakai aturan JSON". res.json(...) memasangnya otomatis. Waktu mengirim JSON dari client, kamu yang menulisnya sendiri (dibahas di pelajaran Request & Response).
Latihan: GET /profile
Bentuknya seperti detail buku ini:
app.get("/books/1", (req, res) => {
res.json({
id: 1,
title: "Laskar Pelangi",
tags: ["novel", "pendidikan"],
author: { id: 1, name: "Andrea Hirata" },
});
});
tags: [...]adalah array di dalam object.author: { ... }adalah object di dalam object.res.jsonmengirim semuanya sebagai satu teks JSON dengan status200.
Di latihan, endpoint-nya GET /profile, berisi name, age, skills (array tiga teks), dan address (object berisi city dan country).
⚠️ Jebakan yang sering ketemu
- Kutip tunggal. Kebiasaan dari JavaScript:
'Budi'sah di kode, ditolak di JSON. - Koma terakhir. Menghapus field terakhir sering meninggalkan koma di baris sebelumnya.
- Angka sebagai teks.
"price": "89000"itu string. Di client,"89000" + 1hasilnya"890001", bukan89001. - Nomor HP sebagai angka.
08123456789ditolakJSON.parse. Tulis"08123456789".
TL;DR: JSON adalah format teks untuk data, dengan enam jenis nilai: string (kutip ganda), number, boolean, null, array [ ], dan object { }, yang boleh bersarang. JSON.parse menolak key tanpa kutip, kutip tunggal, koma terakhir, komentar, undefined, dan angka berawalan nol. Object JavaScript bukan JSON: JSON.stringify mengubah object jadi teks JSON, JSON.parse mengembalikannya, dan res.json melakukannya untukmu. Body JSON dikirim dengan header Content-Type: application/json.