JSON adalah format teks untuk memindahkan data antar program, dan dua metode object JSON menangani kedua arahnya, yaitu stringify yang mengubah nilai menjadi teks dan parse yang mengembalikannya. Di balik kesederhanaan itu ada aturan konversi yang mengubah data tanpa peringatan, misalnya NaN menjadi null dan Date menjadi string. Topik ini membedah kedua metode beserta jebakannya sehingga data yang dikirim sama dengan data yang diterima.
stringify dengan replacer dan indentasi#
JSON.stringify menerima tiga argumen, yaitu nilai yang akan ditulis, replacer opsional, dan jumlah spasi indentasi. Replacer boleh berupa array berisi daftar kunci yang diizinkan, atau fungsi yang dipanggil untuk setiap pasangan kunci dan nilai. Fungsi replacer yang mengembalikan undefined membuang kuncinya dari hasil. Argumen ketiga mengatur indentasi, dan pemasangannya hanya mengubah tampilan teks, bukan isinya.
const rapor = {
nama: "Citra",
nilai: [88, 92],
sandi: "rahasia",
catatan: undefined,
};
const json = JSON.stringify(rapor, ["nama", "nilai", "sandi"], 2);
console.log(json);
const json2 = JSON.stringify(rapor, (kunci, nilai) => {
if (kunci === "sandi") return undefined;
return nilai;
});
console.log(json2);{
"nama": "Citra",
"nilai": [
88,
92
],
"sandi": "rahasia"
}
{"nama":"Citra","nilai":[88,92]}Bentuk pertama memakai daftar izin. Tiga kunci yang tercantum ikut tertulis, sedangkan catatan tersaring tanpa pemeriksaan manual. Bentuk kedua memakai fungsi yang membuang sandi lewat nilai balik undefined. Cara ini lebih luwes karena keputusannya bisa bergantung pada isi nilai, bukan hanya namanya. Indentasi dua spasi berguna untuk log dan berkas yang dibaca manusia, sedangkan teks tanpa indentasi lebih hemat ketika dikirim lewat jaringan, sehingga kedua bentuk tetap dipakai sesuai tujuannya.
Fungsi replacer dipanggil pertama kali dengan kunci berupa string kosong, yaitu pembungkus seluruh nilai, lalu dipanggil lagi untuk setiap kunci di dalamnya. Nilai yang dikembalikan menjadi pengganti aslinya, sehingga transformasi seperti membulatkan angka atau menyaring kunci sekaligus terjadi di satu tempat. Daftar kunci pada bentuk array bekerja dengan aturan yang lebih ketat. Properti yang tidak tercantum tidak akan tertulis, dan kunci pada object bersarang pun harus turut disebut karena daftar itu berlaku di setiap tingkat.
toJSON dan parse dengan reviver#
Metode toJSON pada sebuah object menentukan sendiri bentuk JSON-nya, sedangkan reviver pada JSON.parse mengubah kembali nilai saat penguraian. Ketika stringify menemukan object yang punya toJSON, hasil toJSON itulah yang ditulis, sehingga object bisa mempersingkat dirinya sebelum menjadi teks. Date memang sudah membawa toJSON bawaan, dan itulah alasan tanggal berubah menjadi string ISO pada contoh di bagian akhir topik ini.
const arsip = {
toJSON() {
return { jumlah: 3 };
},
isi: "banyak sekali",
};
console.log(JSON.stringify(arsip));
const mentah = '{"nama":"rapor","tanggal":"2026-03-15T00:00:00.000Z","nilai":[88,92]}';
const kembali = JSON.parse(mentah, (kunci, nilai) => {
if (kunci === "tanggal") return new Date(nilai);
return nilai;
});
console.log(kembali.tanggal instanceof Date);
console.log(kembali.nilai[1] + 1);{"jumlah":3}
true
93Object arsip menyembunyikan isi panjangnya dan hanya menulis {"jumlah":3} karena toJSON menggantikan seluruh isinya. Pada arah sebaliknya, reviver memeriksa setiap kunci hasil penguraian. Kunci tanggal dihidupkan kembali menjadi object Date, sehingga instanceof Date bernilai true. Reviver dipanggil mulai dari nilai terdalam menuju terluar, sehingga transformasi pada kunci bersarang sudah selesai sebelum object pembungkusnya sampai ke fungsi itu.
Aturan nilai balik reviver layak diingat, yaitu mengembalikan undefined berarti menghapus kunci itu dari hasil, sedangkan mengembalikan nilai apa pun menggantikan nilai aslinya. Karena pemanggilannya bergerak dari dalam ke luar, kunci yang dihapus sudah tidak ada ketika object pembungkusnya tiba di fungsi yang sama. Gabungan kedua arah ini membentuk pola yang lengkap, yaitu toJSON menata bentuk sebelum berangkat dan reviver menata kembali sesudah tiba.
Jebakan umum JSON#
JSON hanya mengenal string, number, boolean, null, array, dan object, sehingga nilai di luar daftar itu berubah bentuk atau hilang saat ditulis. Berkas berikut memancing semuanya sekaligus dan dapat dijalankan dengan node jebakan.js.
// Jebakan umum JSON.stringify pada nilai di luar tipe JSON.
const data = {
a: undefined,
b: function () {},
c: NaN,
d: Infinity,
e: new Date(2026, 2, 15),
f: 0,
};
console.log(JSON.stringify(data));
const lingkar = { nama: "A" };
lingkar.diri = lingkar;
try {
JSON.stringify(lingkar);
} catch (error) {
console.log(error.name + ": " + error.message);
}{"c":null,"d":null,"e":"2026-03-15T00:00:00.000Z","f":0}
TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
--- property 'diri' closes the circleKeluaran itu memperlihatkan aturan konversinya satu per satu, dimulai dari properti a dan b yang hilang karena undefined dan fungsi tidak punya bentuk JSON. NaN dan Infinity menjadi null karena JSON hanya mengenal angka berhingga, dan f bernilai 0 tetap tertulis karena nol adalah angka yang sah. Date menjadi string ISO lewat toJSON bawaannya, bentuk yang sah untuk dikirim tetapi sudah bukan object Date ketika kembali. Terakhir, struktur melingkar melempar TypeError karena JSON tidak punya cara menggambarkan object yang memuat dirinya sendiri. Error tersebut ditangkap lalu dicetak ringkas agar pesannya yang terbaca, bukan stack trace penuhnya.
Daftar jebakannya masih panjang dan seluruhnya mengikuti pola yang sama. Kunci symbol pada object tidak tertulis karena tidak punya bentuk string, sementara Map dan Set tidak punya representasi JSON sehingga tertulis sebagai {} kosong, dan BigInt melempar TypeError karena tidak ada bentuk angka JSON yang memuatnya. Aturan yang menghubungkan semuanya sederhana, yaitu apa pun yang berada di luar daftar tipe JSON akan diubah, dibuang, atau dilempar, bukan ditebak.
Ringkasan#
stringifymenerima replacer berupa daftar kunci atau fungsi penyaring beserta indentasi, sedangkanparsemenerima reviver untuk mengubah kembali nilai.undefined, fungsi, dan kunci symbol dibuang,NaNdanInfinitymenjadinull, sedangkanDatemenjadi string ISO danBigIntmelemparTypeError.- Struktur melingkar melempar
TypeErrorkarena format JSON tidak dapat menggambarkan ketergantungan yang melingkar. - Pasangan
toJSONdan reviver menjadi pintu yang benar untuk mengubah bentuk object sebelum dan sesudah perjalanan sebagai teks.
Referensi#
- JSON.stringify() — MDN Web Docs — Parameter replacer, indentasi, dan aturan konversi nilainya.
- JSON.parse() — MDN Web Docs — Penguraian teks JSON dan pemakaian reviver.
- JSON — MDN Web Docs — Ringkasan format JSON beserta kedua metodenya di JavaScript.