Работа с JSON
Вывести массив или объект в формате JSON можно через функцию json_encode()
.
$array = [ 'lang' => 'PHP', 'version' => '8.3.2' ]; json_encode($array); // {"lang":"PHP","version":"8.3.2"}
Данные в формате JSON можно хранить, например, в файлах или в базе данных.
Функция json_encode()
кодирует Юникод, т.е. русский текст преобразуется например в «\u0442\u0435». Чтобы данные возвращались в исходном виде, то добавляют параметр JSON_UNESCAPED_UNICODE
(доступна с версии PHP 5.4).
$data = ['City' => 'Москва']; json_encode($data); // {"City":"\u041c\u043e\u0441\u043a\u0432\u0430"} json_encode($data, JSON_UNESCAPED_UNICODE); // {"City":"Москва"}
Преобразовать JSON в объект
Преобразовать JSON в объект можно через функцию json_decode()
.
$json = json_decode('{"lang":"PHP","version":"8.3.2"}'); $json->lang; // PHP $json->version; // 8.3.2
Если в json_encode()
будет передан пустой массив, то функция вернёт ответ в виде массива (т.е. не в формате JSON). В этой ситуации надо добавить параметр JSON_FORCE_OBJECT
.
json_encode([]); // [] json_encode([], JSON_FORCE_OBJECT); // {}
Вывести страницу как JSON
Если на странице выводится только JSON, то рекомендуется указывать заголовок «application/json». Данный заголовок позволит браузерам и приложениям обрабатывать текст как JSON.
// Вывести текущую страницу как JSON header('Content-Type: application/json'); $array = [ 'lang' => 'PHP', 'framework' => [ 'name' => 'Yii', 'version' => 2 ] ]; echo json_encode($array);
В браузере Firefox страница в формате JSON будет показываться как на картинке ниже:
Если бы не был задан заголовок «application/json», то Firefox вывел бы просто текст.
Также когда в JavaScript идёт запрос на страницу в формате JSON, то JavaScript уже получит данные в формате JSON (т.е. преобразовывать строку в JSON не нужно).
Валидация JSON
Начиная с версии PHP 7.3 стало возможным отлавливать ошибки через флаг JSON_THROW_ON_ERROR:
try { json_decode("{", false, 512, JSON_THROW_ON_ERROR); } catch (\JsonException $exception) { echo $exception->getMessage(); // выводит "Syntax error" }
С версии PHP 8.3 появилась функция json_validate()
.
json_validate('{"test": {"foo": "bar"}}'); // true; json_validate('{"": "": "" }}'); // false
Для валидации рекомендуется использовать первый вариант, т.к. json_validate()
повторно разбивает строку на JSON.
Поддержать автора