json_decode($json, true) zamienia string JSON w wartości PHP, a każdy obiekt JSON w tablicę asocjacyjną. Pomiń true, a obiekty JSON staną się zamiast tego obiektami stdClass, odczytywanymi przez ->. Niepoprawny JSON daje null.
Wynik:
Ada
js
Ada
php
Array
(
[name] => Ada
[age] => 36
[langs] => Array
(
[0] => php
[1] => js
)
[admin] => 1
)
Tablice JSON zawsze stają się listami PHP, niezależnie od wybranego trybu. W drugą stronę, z PHP do JSON, działa json_encode().
Tablica asocjacyjna czy obiekt: true vs false
Oba tryby zawierają te same dane; wybierz ten, który lepiej czyta się w twoim kodzie. Tablice działają z każdą funkcją tablicową (array_column, array_map, isset($data['key'])), więc większość kodu przekazuje true. Obiekty wymagają składni z nawiasami klamrowymi dla kluczy, które nie są poprawnymi nazwami właściwości, takich jak klucze z myślnikiem albo liczbą:
Wynik:
Ada zero London
Ada zero London
object(stdClass)#2 (1) {
["city"]=>
string(6) "London"
}
Czwarty parametr przyjmuje flagi. JSON_OBJECT_AS_ARRAY też daje tablice, ale tylko wtedy, gdy drugi argument to null (jego wartość domyślna): json_decode($json, flags: JSON_OBJECT_AS_ARRAY) zwraca tablice, a json_decode($json, false, 512, JSON_OBJECT_AS_ARRAY) nadal zwraca obiekty.
Pętla po zagnieżdżonym JSON
Odpowiedzi API to zwykle lista obiektów wewnątrz obiektu. Zdekoduj raz, potem przejdź przez nią przez foreach, a dla pól, których może brakować, użyj ??:
Wynik:
#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
)
Obsługa niepoprawnego JSON
json_decode() zwraca null dla niepoprawnego JSON, ale null to też poprawny wynik dla tekstu JSON null, więc samo null nie mówi, czy coś się nie udało. json_last_error_msg() podaje przyczynę ostatniego wywołania. Czystszy sposób to JSON_THROW_ON_ERROR, który rzuca JsonException:
Wynik:
NULL
Syntax error
NULL
No error
Invalid JSON: Syntax error
Trzeci argument, 512, to maksymalna głębokość zagnieżdżenia (domyślna). Z argumentami nazwanymi możesz go pominąć: json_decode($json, true, flags: JSON_THROW_ON_ERROR).
Sprawdzanie poprawności JSON przez json_validate()
PHP 8.3 dodało json_validate(). Odpowiada true albo false bez budowania zdekodowanych tablic, więc zużywa mniej pamięci niż dekodowanie, gdy potrzebujesz tylko odpowiedzi tak lub nie, na przykład aby wcześnie odrzucić treść żądania:
Wynik:
'{"a": 1}' valid
'[1, 2, 3]' valid
'"text"' valid
'{a: 1}' invalid: Syntax error
'{\'a\': 1}' invalid: Syntax error
'' invalid: Syntax error
Jeśli i tak użyjesz danych, pomiń json_validate() i dekoduj z JSON_THROW_ON_ERROR: walidacja przed dekodowaniem parsuje string dwa razy.
Odczyt pliku JSON
Odczytaj plik przez file_get_contents() i zdekoduj string. Ten blok najpierw zapisuje settings.json, żeby było co czytać:
Wynik:
Theme: dark
Plugins: 2
{
"theme": "dark",
"fontSize": 16,
"plugins": [
"git",
"lint"
]
}
Dlaczego json_decode zwraca null: typowe przyczyny
JSON jest bardziej rygorystyczny niż składnia tablic w JavaScripcie i PHP. Każdy string poniżej wygląda rozsądnie i każdy zwraca null. Uruchom to, aby zobaczyć przyczynę każdego, potem popraw jeden i uruchom ponownie:
Wynik:
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"
Znacznik BOM (byte order mark) jest niewidoczny w większości edytorów i to klasyczny powód, dla którego plik JSON „wygląda dobrze”, ale nie daje się zdekodować. Usuń go przed dekodowaniem przez $text = preg_replace('/^\xEF\xBB\xBF/', '', $text);.
Najczęściej zadawane pytania
Jak zamienić JSON na tablicę w PHP?
Przekaż true jako drugi argument: json_decode('{"name":"Ada"}', true) zwraca ['name' => 'Ada'], więc wartości czytasz przez $data['name']. Bez true obiekty JSON stają się obiektami stdClass i piszesz $data->name.
Dlaczego json_decode zwraca null?
JSON jest niepoprawny (pojedyncze cudzysłowy, przecinek na końcu, klucze bez cudzysłowów, znacznik BOM), zagnieżdżenie przekracza limit głębokości albo JSON naprawdę jest null. Sprawdź json_last_error_msg() albo dekoduj z JSON_THROW_ON_ERROR, aby dostać JsonException z przyczyną.
Jak sprawdzić, czy string jest poprawnym JSON w PHP?
Od PHP 8.3 json_validate($string) zwraca true albo false bez budowania zdekodowanej wartości. W starszych wersjach zdekoduj go i sprawdź json_last_error() === JSON_ERROR_NONE.
Jak odczytać plik JSON w PHP?
Odczytaj plik, a potem go zdekoduj: $data = json_decode(file_get_contents('data.json'), true, flags: JSON_THROW_ON_ERROR);. file_get_contents() zwraca false, jeśli pliku brakuje, więc najpierw to sprawdź.
Jak odczytać klucz JSON z myślnikiem w PHP?
Zdekoduj do tablicy i użyj $data['first-name'], a przy obiektach użyj nawiasów klamrowych: $obj->{'first-name'}. Ta sama składnia z nawiasami działa dla kluczy będących liczbami, na przykład $obj->{'0'}.