json_encode($value) zwraca tekst JSON dla wartości PHP. Tablica asocjacyjna staje się obiektem JSON, lista (klucze 0, 1, 2...) tablicą JSON, a stringi, liczby, true, false i null swoimi odpowiednikami w JSON.
Wynik:
{"name":"Ada","age":36,"langs":["php","js"],"admin":true,"manager":null}
string
Wynik to zwykły string, gotowy do wysłania do przeglądarki, zapisania w pliku lub kolumnie bazy danych albo przekazania do innego programu. Aby zamienić JSON z powrotem na PHP, użyj json_decode().
Ładne formatowanie JSON
json_encode() przyjmuje flagi jako drugi argument. JSON_PRETTY_PRINT dodaje złamania linii i wcięcia po 4 spacje, czego chcesz w pliku konfiguracyjnym albo logu do debugowania. Łącz kilka flag przez |:
Wynik:
{
"app": "shop",
"debug": false,
"db": {
"host": "localhost",
"port": 3306
},
"tags": []
}
Czytelny tekst polski, japoński i inny UTF-8
Domyślnie json_encode() zapisuje każdy znak spoza ASCII jako sekwencję \u i wstawia ukośnik wsteczny przed każdym /. Oba zapisy to poprawny JSON i dekodują się do tego samego tekstu, ale utrudniają czytanie wyniku i go wydłużają. JSON_UNESCAPED_UNICODE zachowuje znaki, a JSON_UNESCAPED_SLASHES zostawia adresy URL bez zmian:
Wynik:
{"name":"\u308a\u3093\u3054","price":120,"url":"https:\/\/example.com\/fruit\/apple"}
{"name":"りんご","price":120,"url":"https://example.com/fruit/apple"}
Jeśli tekst po zdekodowaniu wygląda na zepsuty (krzaki zamiast liter, po japońsku 文字化け), problemem nie są sekwencje ucieczki: string od początku nie był w UTF-8. json_encode() przyjmuje tylko UTF-8 i dla wszystkiego innego zwraca false, co pokazuje sekcja o błędach.
Kiedy tablica staje się obiektem zamiast listy
Tablica PHP jest kodowana jako tablica JSON tylko wtedy, gdy jej klucze to dokładnie 0, 1, 2... po kolei. Każde inne klucze czynią z niej obiekt JSON. To zaskakuje po unset() albo array_filter(), które zostawiają luki w kluczach:
Wynik:
{"0":"apple","2":"cherry"}
["apple","cherry"]
{"1":"a","2":"b"}
[]
{}
{"0":"a","1":"b"}
Wywołuj array_values() przed kodowaniem zawsze, gdy kod odbierający oczekuje listy. Jeśli oczekuje obiektu, który może być pusty, użyj new stdClass() albo (object) $array, żeby pusta wartość nadal wychodziła jako {}.
Kodowanie obiektu i kontrola jego JSON przez JsonSerializable
Zwykły obiekt jest kodowany tylko z publicznymi właściwościami; chronione i prywatne są pomijane. Aby dokładnie zdecydować, jak obiekt wygląda w JSON, zaimplementuj interfejs JsonSerializable i zwróć dane z jsonSerialize():
Wynik:
{"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"
}
Enum backed, taki jak enum Status: string, koduje się jako swoja wartość ("active"). Enum czysty nie ma wartości, więc json_encode() zawodzi na nim z komunikatem „Non-backed enums have no default serialization”.
Liczby, liczby zmiennoprzecinkowe i stringi liczbowe
Liczby całkowite i zmiennoprzecinkowe są zapisywane jako liczby JSON, a stringi pozostają stringami, nawet gdy zawierają cyfry. Zmieniają to trzy flagi:
Wynik:
{"price":10}
{"price":10.0}
0.30000000000000004
{"qty":"3","id":"007"}
{"qty":3,"id":7}
JSON_NUMERIC_CHECK konwertuje każdy string liczbowy, więc identyfikator taki jak "007" albo kod pocztowy taki jak "01234" traci zera wiodące. Zamiast używać tej flagi na całej tablicy, konwertuj wybrane pola przez (int).
json_encode zwraca false: znajdź błąd
json_encode() zwraca false, gdy nie potrafi zakodować wartości. Zwykłe przyczyny to string, który nie jest poprawnym UTF-8 (tekst odczytany ze starego pliku lub bazy w Latin-1 czy Windows-1250), oraz wartości zmiennoprzecinkowe NAN i INF. json_last_error_msg() mówi, co poszło nie tak; JSON_THROW_ON_ERROR sprawia, że zamiast tego rzucany jest JsonException:
Wynik:
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 to lepsza wartość domyślna w nowym kodzie: false, którego nikt nie sprawdza, trafia w końcu do zapisu lub wysyłki jako pusty string.
Zwracanie JSON z API w PHP
Skrypt PHP odpowiadający JSON ustawia nagłówek Content-Type przed wypisaniem czegokolwiek, koduje raz i kończy działanie:
<?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;
Gdy zamiast tego wypisujesz JSON wewnątrz znacznika HTML <script>, dodaj JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT. Domyślne escapowanie ukośników zamienia </script> w <\/script>, ale ta ochrona znika, gdy tylko ktoś doda JSON_UNESCAPED_SLASHES, a <!-- w wartości nadal zmienia sposób, w jaki przeglądarka parsuje skrypt. Te flagi zapisują <, >, &, ' i " jako \u003C, \u003E, \u0026, \u0027 i \u0022, które JavaScript odczytuje z powrotem jako te same znaki.
Najczęściej zadawane pytania
Jak zamienić tablicę PHP na JSON?
Przekaż ją do json_encode(): json_encode(['name' => 'Ada', 'age' => 36]) zwraca {"name":"Ada","age":36}. Tablica z kluczami 0, 1, 2... po kolei staje się zamiast tego tablicą JSON: json_encode(['a', 'b']) zwraca ["a","b"].
Jak ładnie sformatować JSON w PHP?
Dodaj flagę JSON_PRETTY_PRINT: json_encode($data, JSON_PRETTY_PRINT) wcina 4 spacjami i umieszcza każdą wartość w osobnej linii. Łącz flagi przez |, na przykład JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE.
Dlaczego json_encode zamienia polski lub japoński tekst na kody \u?
Domyślnie każdy znak spoza ASCII jest zapisywany jako sekwencja \uXXXX, więc りんご staje się \u308a\u3093\u3054. To nadal poprawny JSON, ale przekaż JSON_UNESCAPED_UNICODE, aby znaki pozostały czytelne.
Dlaczego json_encode zwraca false?
Zwykle dlatego, że string nie jest poprawnym UTF-8 albo dane zawierają NAN lub INF. Wywołaj json_last_error_msg(), aby poznać przyczynę, albo przekaż JSON_THROW_ON_ERROR, aby funkcja rzucała JsonException zamiast zwracać false.
Jak sprawić, by json_encode dla pustej tablicy zwracało {} zamiast []?
Pusta tablica PHP zawsze koduje się jako []. Użyj new stdClass() albo (object) [] dla pustego obiektu albo flagi JSON_FORCE_OBJECT, która zamienia każdą tablicę w wartości w obiekt.