Menu

json_decode() w PHP: JSON do tablic lub obiektów

json_decode($json, true) zamienia string JSON w tablicę asocjacyjną PHP; bez true dostajesz obiekty stdClass. Poznaj zagnieżdżone wartości, obsługę błędów przez JSON_THROW_ON_ERROR, json_validate() i powody, dla których json_decode zwraca null.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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'}.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ