Работа с 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 будет показываться как на картинке ниже:

JSON в Firefox

Если бы не был задан заголовок «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.