json_decode($json, true) bir JSON dizgesini, her JSON nesnesi bir ilişkisel dizi olacak şekilde PHP değerlerine çevirir. true yazmazsanız JSON nesneleri bunun yerine -> ile okunan stdClass nesnelerine dönüşür. Geçersiz JSON null verir.
Çıktı:
Ada
js
Ada
php
Array
(
[name] => Ada
[age] => 36
[langs] => Array
(
[0] => php
[1] => js
)
[admin] => 1
)
Hangi modu seçerseniz seçin JSON dizileri her zaman PHP listelerine dönüşür. Diğer yön, PHP'den JSON'a, json_encode() fonksiyonudur.
İlişkisel dizi mi nesne mi: true ve false
İki mod da aynı veriyi tutar; kodunuzda daha iyi okunanı seçin. Diziler her dizi fonksiyonuyla çalışır (array_column, array_map, isset($data['key'])), bu yüzden kodların çoğu true verir. Nesneler, tire veya sayı içeren anahtarlar gibi geçerli özellik adı olmayan anahtarlar için süslü parantez söz dizimi gerektirir:
Çıktı:
Ada zero London
Ada zero London
object(stdClass)#2 (1) {
["city"]=>
string(6) "London"
}
Dördüncü parametre bayrakları alır. JSON_OBJECT_AS_ARRAY de dizi verir, ama yalnızca ikinci argüman null (varsayılan değeri) iken: json_decode($json, flags: JSON_OBJECT_AS_ARRAY) dizi döndürür, json_decode($json, false, 512, JSON_OBJECT_AS_ARRAY) ise yine nesne döndürür.
İç içe JSON üzerinde dolaşma
API yanıtları genellikle bir nesnenin içindeki bir nesne listesidir. Bir kez çözümleyin, sonra foreach ile dolaşın ve eksik olabilecek alanlar için ?? kullanın:
Çıktı:
#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
)
Geçersiz JSON'u ele alma
json_decode() geçersiz JSON için null döndürür, ama null aynı zamanda null JSON metni için de doğru sonuçtur, bu yüzden tek başına null başarısız olup olmadığını söylemez. json_last_error_msg() son çağrının nedenini verir. Daha temiz yol bir JsonException fırlatan JSON_THROW_ON_ERROR kullanmaktır:
Çıktı:
NULL
Syntax error
NULL
No error
Invalid JSON: Syntax error
Üçüncü argüman 512 en büyük iç içelik derinliğidir (varsayılan). Adlandırılmış argümanlarla onu atlayabilirsiniz: json_decode($json, true, flags: JSON_THROW_ON_ERROR).
json_validate() ile bir dizgenin geçerli JSON olup olmadığını kontrol etme
PHP 8.3 json_validate() fonksiyonunu ekledi. Çözümlenmiş dizileri oluşturmadan true veya false yanıtını verir, bu yüzden tek ihtiyacınız evet veya hayır olduğunda, örneğin bir istek gövdesini erkenden reddetmek için, çözümlemekten daha az bellek kullanır:
Çıktı:
'{"a": 1}' valid
'[1, 2, 3]' valid
'"text"' valid
'{a: 1}' invalid: Syntax error
'{\'a\': 1}' invalid: Syntax error
'' invalid: Syntax error
Veriyi zaten kullanacaksanız json_validate() adımını atlayın ve JSON_THROW_ON_ERROR ile çözümleyin: önce doğrulamak dizgeyi iki kez ayrıştırır.
Bir JSON dosyasını okuma
Dosyayı file_get_contents() ile okuyun ve dizgeyi çözümleyin. Bu blok okunacak bir dosya olsun diye önce settings.json dosyasını yazar:
Çıktı:
Theme: dark
Plugins: 2
{
"theme": "dark",
"fontSize": 16,
"plugins": [
"git",
"lint"
]
}
json_decode neden null döndürür: olağan nedenler
JSON, JavaScript ve PHP dizi söz diziminden daha katıdır. Aşağıdaki her dizge makul görünür ve her biri null döndürür. Her birinin nedenini görmek için çalıştırın, sonra birini düzeltip tekrar çalıştırın:
Çıktı:
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"
Bir bayt sırası işareti (BOM) çoğu editörde görünmezdir ve bir JSON dosyasının "iyi görünüp" çözümlenmemesinin klasik nedenidir. Çözümlemeden önce onu $text = preg_replace('/^\xEF\xBB\xBF/', '', $text); ile temizleyin.
Sıkça Sorulan Sorular
PHP'de JSON'u bir diziye nasıl çeviririm?
İkinci argüman olarak true verin: json_decode('{"name":"Ada"}', true) ['name' => 'Ada'] döndürür, böylece değerleri $data['name'] ile okursunuz. true olmadan JSON nesneleri stdClass nesnelerine dönüşür ve $data->name yazarsınız.
json_decode neden null döndürüyor?
JSON geçersizdir (tek tırnaklar, sondaki bir virgül, tırnaksız anahtarlar, bir bayt sırası işareti), derinlik sınırından daha derin iç içedir ya da JSON gerçekten null değeridir. json_last_error_msg() kontrol edin ya da nedeni içeren bir JsonException almak için JSON_THROW_ON_ERROR ile çözümleyin.
PHP'de bir dizgenin geçerli JSON olup olmadığını nasıl kontrol ederim?
PHP 8.3'ten beri json_validate($string) çözümlenmiş değeri oluşturmadan true veya false döndürür. Eski sürümlerde çözümleyin ve json_last_error() === JSON_ERROR_NONE kontrol edin.
PHP'de bir JSON dosyasını nasıl okurum?
Dosyayı okuyun, sonra çözümleyin: $data = json_decode(file_get_contents('data.json'), true, flags: JSON_THROW_ON_ERROR);. Dosya yoksa file_get_contents() false döndürür, bu yüzden önce bunu kontrol edin.
PHP'de tire içeren bir JSON anahtarına nasıl erişirim?
Bir diziye çözümleyin ve $data['first-name'] kullanın ya da nesnelerle süslü parantez kullanın: $obj->{'first-name'}. Aynı süslü parantez söz dizimi $obj->{'0'} gibi sayı olan anahtarlar için de çalışır.