Menu

JSON di JavaScript: JSON.stringify, JSON.parse, dan Jebakan Umum

Cara mengubah objek JavaScript menjadi JSON dan sebaliknya: JSON.stringify, JSON.parse, hook replacer dan reviver, serta nilai yang tidak selamat dalam perjalanan bolak-balik.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

JSON Adalah Teks, Bukan Objek

JSON (JavaScript Object Notation) adalah format teks untuk bertukar data. Bentuknya mirip literal objek JavaScript, tetapi ia adalah string: deretan karakter yang bisa kamu kirim lewat jaringan, simpan ke file, atau tempel ke sebuah konfigurasi.

// A JavaScript object - a live value in memory.
const user = { name: "Rosa", age: 30 };

// JSON - a string of text that represents the same data.
const json = '{"name":"Rosa","age":30}';

Keduanya mudah tertukar karena terlihat mirip. Model mental yang menjaga kamu tetap lurus: objek hidup di dalam programmu; JSON adalah wujudnya saat keluar dari program. Kamu mengubah satu ke yang lain dengan dua fungsi: JSON.stringify (objek → string) dan JSON.parse (string → objek).

JSON.stringify: Objek ke String

Ubah nilai JavaScript apa pun menjadi representasi JSON-nya:

Hasilnya string satu baris tanpa spasi: ringkas, ideal untuk dikirim lewat jaringan. Pengecekan typeof membuktikannya: string, bukan object.

Agar mudah dibaca saat debug, berikan dua argumen tambahan. Yang kedua adalah replacer (kita bahas nanti); memberikan null berarti "sertakan semuanya". Yang ketiga adalah indentasi:

Itulah bentuk pretty-print yang standar. Pakai 2 atau 4 spasi, sesuai dengan yang dihasilkan kebanyakan tools.

JSON.parse: String ke Objek

Kebalikannya: ambil string JSON, dapatkan kembali nilai JavaScript.

Setelah di-parse, kamu berurusan dengan objek biasa: akses dengan titik, akses dengan kurung siku, method array, semuanya bisa.

JSON.parse itu rewel. Semua ini memunculkan SyntaxError:

JSON.parse("{name: 'Rosa'}");      // unquoted key, single quotes
JSON.parse('{"name": "Rosa",}');   // trailing comma
JSON.parse("// a comment\n{}");    // comments aren't allowed
JSON.parse("");                    // empty string

Setiap kali input berasal dari luar programmu, seperti response fetch, file, atau input pengguna, bungkus parsing-nya dengan try/catch:

Nilai yang Tidak Selamat dalam Perjalanan Bolak-Balik

JSON mendukung enam tipe nilai: string, angka, boolean, null, array, dan objek biasa. Semua yang lain di JavaScript akan dibuang, diubah, atau malah rusak.

Yang terjadi:

  • Fungsi dan undefined diam-diam dihapus dari objek. Di dalam array, keduanya menjadi null, karena array di JSON tidak boleh punya celah.
  • Objek Date diserialisasi menjadi string ISO lewat method toJSON miliknya. Parsing mengembalikan string-nya, bukan Date.
  • BigInt memunculkan TypeError. Angka di JSON tidak punya padanannya.
  • Map, Set, dan referensi melingkar juga tidak berfungsi begitu saja.

Solusi untuk Date dalam perjalanan bolak-balik adalah fungsi reviver milik JSON.parse:

Reviver berjalan untuk setiap pasangan key/value dan memungkinkanmu mengubah nilai saat dimasukkan.

Replacer: Menyaring Apa yang Diserialisasi

Argumen kedua JSON.stringify memungkinkanmu mengatur apa yang masuk ke output. Berikan array berisi key untuk mengizinkan hanya key tersebut:

Atau berikan fungsi untuk logika apa pun: membuang field, menyamarkan nilai, mengubahnya saat itu juga:

Mengembalikan undefined menghapus key-nya. Mengembalikan nilai lain akan menggantikannya.

Kustomisasi dengan toJSON

Kalau sebuah objek punya method toJSON, JSON.stringify memanggilnya dan menyerialisasi nilai kembaliannya. Begitulah Date mengatur formatnya sendiri, dan kamu bisa memakai hook yang sama:

Sangat cocok untuk class yang ingin bentuk publik yang konsisten, siapa pun yang menyerialisasinya.

Deep Clone (Trik Lama, dan yang Lebih Baik)

Selama bertahun-tahun, JSON.parse(JSON.stringify(obj)) adalah jurus satu baris untuk melakukan deep clone pada objek biasa:

Cara itu berfungsi, selama objeknya hanya berisi nilai yang aman untuk JSON. Date, Map, dan fungsi semuanya merusaknya (lihat masalah perjalanan bolak-balik di atas).

JavaScript modern punya structuredClone, yang menangani Date, Map, Set, typed array, dan referensi melingkar:

Pakai structuredClone kalau bisa. Simpan trik JSON.parse(JSON.stringify(...)) sebagai cadangan untuk clone cepat dan seadanya pada data biasa.

Contoh Realistis: Mengambil dan Mem-parsing Data

Tempat paling umum kamu bersentuhan dengan JSON adalah HTTP. fetch tidak mem-parsing JSON untukmu: kamu memanggil .json() pada response-nya (yang sebenarnya adalah JSON.parse pada body response):

Mengirim JSON adalah kebalikannya: lakukan JSON.stringify pada body dan atur header Content-Type.

await fetch("/api/users", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "Rosa", age: 30 }),
});

Kedua pola ini mencakup sebagian besar pekerjaan JSON di dunia nyata.

Berikutnya: Optional Chaining

JSON yang sudah di-parse sering punya field opsional, seperti user.address.city yang mungkin tidak ada, atau response.data.items yang bisa saja hilang. Mengakses property yang bersarang dalam tanpa crash adalah fungsi optional chaining (?.), dan itulah topik halaman berikutnya.

Pertanyaan yang sering diajukan

Apa bedanya JSON dan objek JavaScript?

JSON adalah format teks: sebuah string yang terlihat seperti literal objek JavaScript tetapi dengan aturan yang lebih ketat. Key wajib memakai tanda kutip ganda, string wajib memakai tanda kutip ganda, dan nilainya terbatas pada string, angka, boolean, null, array, dan objek biasa. Objek JavaScript adalah nilai hidup di memori yang bisa menyimpan fungsi, undefined, instance Date, dan apa pun lainnya.

Bagaimana cara mengubah objek JavaScript menjadi JSON?

Panggil JSON.stringify(obj). Fungsi ini menelusuri objek dan mengembalikan string JSON. Berikan argumen ketiga seperti JSON.stringify(obj, null, 2) untuk mencetaknya rapi dengan indentasi 2 spasi. Fungsi dan nilai undefined dibuang dari objek dan menjadi null di dalam array.

Mengapa JSON.parse memunculkan error?

JSON.parse itu ketat: koma di akhir, tanda kutip tunggal, key tanpa tanda kutip, dan komentar semuanya menyebabkan SyntaxError. Bungkus panggilannya dengan try/catch setiap kali input berasal dari request jaringan, file, atau pengguna, yaitu di mana pun string-nya mungkin bukan JSON yang valid.

Apakah JSON.stringify mempertahankan Date?

Tidak. Date berubah menjadi string ISO seperti "2026-01-15T10:30:00.000Z". Saat kamu melakukan JSON.parse kembali, yang kamu dapat adalah string itu, bukan objek Date. Pakai argumen reviver milik JSON.parse untuk mengubah string ISO kembali menjadi instance Date kalau kamu membutuhkannya.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai