json_decode($json, true) mengubah string JSON menjadi nilai PHP, dengan setiap object JSON menjadi array asosiatif. Tanpa true, object JSON menjadi object stdClass, yang dibaca dengan ->. JSON yang tidak valid menghasilkan null.
Output:
Ada
js
Ada
php
Array
(
[name] => Ada
[age] => 36
[langs] => Array
(
[0] => php
[1] => js
)
[admin] => 1
)
Array JSON selalu menjadi list PHP, mode mana pun yang kamu pilih. Untuk arah sebaliknya, dari PHP ke JSON, pakai json_encode().
Array asosiatif atau object: true vs false
Kedua mode menyimpan data yang sama; pilih yang lebih enak dibaca di kodemu. Array bisa dipakai dengan setiap fungsi array (array_column, array_map, isset($data['key'])), jadi sebagian besar kode memberikan true. Object butuh sintaks kurung kurawal untuk key yang bukan nama property yang valid, seperti key yang mengandung tanda hubung atau berupa angka:
Output:
Ada zero London
Ada zero London
object(stdClass)#2 (1) {
["city"]=>
string(6) "London"
}
Parameter keempat menerima flag. JSON_OBJECT_AS_ARRAY juga menghasilkan array, tetapi hanya selama argumen kedua bernilai null (nilai default-nya): json_decode($json, flags: JSON_OBJECT_AS_ARRAY) mengembalikan array, sedangkan json_decode($json, false, 512, JSON_OBJECT_AS_ARRAY) tetap mengembalikan object.
Perulangan atas JSON bersarang
Response API biasanya berupa list object di dalam sebuah object. Decode sekali, lalu telusuri dengan foreach, dan pakai ?? untuk field yang mungkin tidak ada:
Output:
#1 Ada <ada@example.com> roles: admin, editor
#2 Linus <no email> roles: none
#3 Grace <grace@example.com> roles: editor
Array
(
[1] => Ada
[2] => Linus
[3] => Grace
)
Menangani JSON yang tidak valid
json_decode() mengembalikan null untuk JSON yang tidak valid, tetapi null juga merupakan hasil yang benar untuk teks JSON null, jadi null saja tidak memberi tahu apakah decode-nya gagal. json_last_error_msg() memberikan alasan dari pemanggilan terakhir. Untuk menemukan letak kesalahannya di dokumen yang panjang, tempel ke JSON formatter, yang menunjuk baris yang error. Cara yang lebih rapi adalah JSON_THROW_ON_ERROR, yang melempar JsonException:
Output:
NULL
Syntax error
NULL
No error
Invalid JSON: Syntax error
Argumen ketiga, 512, adalah kedalaman nesting maksimum (nilai default-nya). Dengan named argument kamu bisa melewatinya: json_decode($json, true, flags: JSON_THROW_ON_ERROR).
Cek apakah string adalah JSON yang valid dengan json_validate()
PHP 8.3 menambahkan json_validate(). Fungsi ini menjawab true atau false tanpa membuat array hasil decode, jadi memakai lebih sedikit memori daripada decode saat yang kamu butuhkan hanya jawaban ya atau tidak, misalnya untuk menolak body request sejak awal:
Output:
'{"a": 1}' valid
'[1, 2, 3]' valid
'"text"' valid
'{a: 1}' invalid: Syntax error
'{\'a\': 1}' invalid: Syntax error
'' invalid: Syntax error
Jika datanya akan tetap kamu pakai, lewati json_validate() dan langsung decode dengan JSON_THROW_ON_ERROR: memvalidasi dulu berarti string-nya di-parse dua kali.
Membaca file JSON
Baca file-nya dengan file_get_contents() lalu decode string-nya. Blok ini menulis settings.json lebih dulu agar ada file yang bisa dibaca:
Output:
Theme: dark
Plugins: 2
{
"theme": "dark",
"fontSize": 16,
"plugins": [
"git",
"lint"
]
}
Kenapa json_decode mengembalikan null: penyebab yang umum
JSON lebih ketat daripada sintaks JavaScript dan array PHP. Setiap string di bawah ini terlihat wajar dan semuanya mengembalikan null. Jalankan untuk melihat alasan masing-masing, lalu perbaiki salah satunya dan jalankan lagi:
Output:
single quotes Syntax error
unquoted key Syntax error
trailing comma Syntax error
comment Syntax error
byte order mark Syntax error
too deep Maximum stack depth exceeded
float(1.2345678901234567E+19)
string(20) "12345678901234567890"
Byte order mark tidak terlihat di sebagian besar editor dan merupakan penyebab klasik file JSON yang "terlihat baik-baik saja" tetapi tidak bisa di-decode. Buang dengan $text = preg_replace('/^\xEF\xBB\xBF/', '', $text); sebelum melakukan decode.
Pertanyaan yang sering diajukan
Bagaimana cara mengubah JSON menjadi array di PHP?
Berikan true sebagai argumen kedua: json_decode('{"name":"Ada"}', true) mengembalikan ['name' => 'Ada'], jadi kamu membaca nilainya dengan $data['name']. Tanpa true, object JSON menjadi object stdClass dan kamu menulis $data->name.
Kenapa json_decode mengembalikan null?
JSON-nya tidak valid (tanda kutip tunggal, koma di akhir, key tanpa tanda kutip, byte order mark), nesting-nya lebih dalam dari batas kedalaman, atau JSON-nya memang null. Periksa json_last_error_msg(), atau decode dengan JSON_THROW_ON_ERROR untuk mendapatkan JsonException beserta alasannya.
Bagaimana cara mengecek apakah sebuah string adalah JSON yang valid di PHP?
Sejak PHP 8.3, json_validate($string) mengembalikan true atau false tanpa membuat nilai hasil decode. Di versi yang lebih lama, decode string-nya lalu periksa json_last_error() === JSON_ERROR_NONE.
Bagaimana cara membaca file JSON di PHP?
Baca file-nya, lalu decode: $data = json_decode(file_get_contents('data.json'), true, flags: JSON_THROW_ON_ERROR);. file_get_contents() mengembalikan false jika file-nya tidak ada, jadi periksa hal itu lebih dulu.
Bagaimana cara mengakses key JSON yang mengandung tanda hubung di PHP?
Decode menjadi array lalu pakai $data['first-name'], atau dengan object pakai kurung kurawal: $obj->{'first-name'}. Sintaks kurung kurawal yang sama juga berlaku untuk key berupa angka, seperti $obj->{'0'}.