json_encode($value) mengembalikan teks JSON untuk sebuah nilai PHP. Array asosiatif menjadi object JSON, list (key 0, 1, 2...) menjadi array JSON, dan string, angka, true, false, serta null menjadi padanannya di JSON.
Output:
{"name":"Ada","age":36,"langs":["php","js"],"admin":true,"manager":null}
string
Hasilnya adalah string biasa, siap dikirim ke browser, disimpan di file atau kolom database, atau diberikan ke program lain. Untuk mengubah JSON kembali menjadi PHP, pakai json_decode().
Pretty print JSON
json_encode() menerima flag sebagai argumen keduanya. JSON_PRETTY_PRINT menambahkan baris baru dan indentasi 4 spasi, yang kamu butuhkan di file konfigurasi atau log debug. Gabungkan beberapa flag dengan |:
Output:
{
"app": "shop",
"debug": false,
"db": {
"host": "localhost",
"port": 3306
},
"tags": []
}
Menjaga teks Jepang dan teks UTF-8 lain tetap terbaca
Secara default, json_encode() menulis setiap karakter non-ASCII sebagai escape \u dan menaruh backslash sebelum setiap /. Keduanya JSON yang valid dan di-decode kembali menjadi teks yang sama, tetapi membuat output sulit dibaca dan lebih panjang. JSON_UNESCAPED_UNICODE mempertahankan karakternya, dan JSON_UNESCAPED_SLASHES mempertahankan URL apa adanya:
Output:
{"name":"\u308a\u3093\u3054","price":120,"url":"https:\/\/example.com\/fruit\/apple"}
{"name":"りんご","price":120,"url":"https://example.com/fruit/apple"}
Jika teks Jepang terlihat rusak (文字化け) setelah di-decode, masalahnya bukan pada escape: string-nya memang bukan UTF-8 sejak awal. json_encode() hanya menerima UTF-8 dan mengembalikan false untuk yang lain, seperti yang ditunjukkan di bagian tentang error.
Saat array menjadi object, bukan list
Array PHP di-encode menjadi array JSON hanya jika key-nya persis 0, 1, 2... secara berurutan. Key lain apa pun membuatnya menjadi object JSON. Hal ini sering menjebak setelah unset() atau array_filter(), yang meninggalkan celah di key-nya:
Output:
{"0":"apple","2":"cherry"}
["apple","cherry"]
{"1":"a","2":"b"}
[]
{}
{"0":"a","1":"b"}
Panggil array_values() sebelum encode setiap kali kode penerima mengharapkan list. Jika kode itu mengharapkan object yang mungkin kosong, pakai new stdClass() atau (object) $array agar nilai kosong tetap keluar sebagai {}.
Encode object dan atur JSON-nya dengan JsonSerializable
Object biasa di-encode hanya dengan property public-nya; property protected dan private dilewati. Untuk menentukan dengan persis seperti apa sebuah object di JSON, implementasikan interface JsonSerializable dan kembalikan datanya dari jsonSerialize():
Output:
{"name":"Ada","nick":null}
{"date":"2026-03-14 09:30:00.000000","timezone_type":3,"timezone":"UTC"}
{
"id": 7,
"total": 19.5,
"created": "2026-03-14T09:30:00+00:00"
}
Backed enum seperti enum Status: string di-encode menjadi nilainya ("active"). Pure enum tidak punya nilai, jadi json_encode() gagal dengan pesan "Non-backed enums have no default serialization".
Angka, float, dan string numerik
Integer dan float ditulis sebagai angka JSON, dan string tetap menjadi string meskipun berisi angka. Tiga flag mengubah perilaku itu:
Output:
{"price":10}
{"price":10.0}
0.30000000000000004
{"qty":"3","id":"007"}
{"qty":3,"id":7}
JSON_NUMERIC_CHECK mengonversi setiap string numerik, jadi ID seperti "007" atau kode pos seperti "01234" kehilangan nol di depannya. Konversi field yang kamu maksud dengan (int) alih-alih memakai flag itu pada seluruh array.
json_encode mengembalikan false: menemukan error-nya
json_encode() mengembalikan false saat tidak bisa meng-encode nilainya. Penyebab yang umum adalah string yang bukan UTF-8 yang valid (teks yang dibaca dari file lama atau database Latin-1) dan nilai float NAN serta INF. json_last_error_msg() memberi tahu apa yang salah; JSON_THROW_ON_ERROR membuatnya melempar JsonException:
Output:
bool(false)
Malformed UTF-8 characters, possibly incorrectly encoded
{"name":"Caf\ufffd"}
{"name":"Café"}
JsonException: Inf and NaN cannot be JSON encoded
JSON_THROW_ON_ERROR adalah default yang lebih baik di kode baru: false yang tidak diperiksa siapa pun akan tersimpan atau terkirim sebagai string kosong.
Mengembalikan JSON dari API PHP
Script PHP yang menjawab dengan JSON mengatur header Content-Type sebelum mencetak apa pun, melakukan encode sekali, lalu berhenti:
<?php
header('Content-Type: application/json; charset=utf-8');
$products = [
['id' => 1, 'name' => 'りんご', 'price' => 120],
['id' => 2, 'name' => 'みかん', 'price' => 80],
];
echo json_encode(['data' => $products], JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
exit;
Saat kamu mencetak JSON di dalam tag <script> HTML, tambahkan JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT. Escape slash bawaan mengubah </script> menjadi <\/script>, tetapi perlindungan itu hilang begitu seseorang menambahkan JSON_UNESCAPED_SLASHES, dan <!-- di dalam nilai tetap mengubah cara browser mem-parse script-nya. Flag-flag itu menulis <, >, &, ', dan " sebagai \u003C, \u003E, \u0026, \u0027, dan \u0022, yang dibaca kembali oleh JavaScript sebagai karakter yang sama.
Pertanyaan yang sering diajukan
Bagaimana cara mengubah array PHP menjadi JSON?
Berikan ke json_encode(): json_encode(['name' => 'Ada', 'age' => 36]) mengembalikan {"name":"Ada","age":36}. Array dengan key 0, 1, 2... yang berurutan menjadi array JSON: json_encode(['a', 'b']) mengembalikan ["a","b"].
Bagaimana cara mencetak JSON dengan rapi (pretty print) di PHP?
Tambahkan flag JSON_PRETTY_PRINT: json_encode($data, JSON_PRETTY_PRINT) memberi indentasi 4 spasi dan menaruh setiap nilai di barisnya sendiri. Gabungkan beberapa flag dengan |, misalnya JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE.
Kenapa json_encode mengubah teks Jepang menjadi kode \u?
Secara default, setiap karakter non-ASCII ditulis sebagai escape \uXXXX, jadi りんご menjadi \u308a\u3093\u3054. Hasilnya tetap JSON yang valid, tetapi berikan JSON_UNESCAPED_UNICODE agar karakternya tetap mudah dibaca.
Kenapa json_encode mengembalikan false?
Biasanya karena ada string yang bukan UTF-8 yang valid, atau datanya berisi NAN atau INF. Panggil json_last_error_msg() untuk melihat alasannya, atau berikan JSON_THROW_ON_ERROR agar fungsi ini melempar JsonException alih-alih mengembalikan false.
Bagaimana agar json_encode menghasilkan {} alih-alih [] untuk array kosong?
Array PHP yang kosong selalu di-encode menjadi []. Pakai new stdClass() atau (object) [] untuk object kosong, atau flag JSON_FORCE_OBJECT, yang mengubah setiap array dalam nilai itu menjadi object.