🧱 Суть

JSON (JavaScript Object Notation) – это текстовый формат обмена данными.

Он часто используется для:

  • API-запросов
  • конфигурационных файлов
  • хранения структурированных данных
  • передачи данных между клиентом и сервером

Пример JSON:

{
    "name": "Alex",
    "age": 25,
    "isAdmin": false
}

В PHP JSON обычно используется для преобразования:

PHP массив/объект
        ↓
     JSON
        ↓
HTTP / файл / API

📦 Проблема

1. PHP и внешние системы используют разные форматы данных

Например, PHP хранит данные как массив:

$user = [
    'name' => 'Alex',
    'age' => 25
];

Но API ожидает JSON:

{
    "name": "Alex",
    "age": 25
}

Нужно преобразование между форматами.

2. Данные нужно сохранять в читаемом виде

Например:

  • настройки приложения
  • кеш
  • конфигурации

Хранить PHP-массив напрямую в файле неудобно:

Array
(
    [name] => Alex
)

JSON подходит для таких задач:

{
    "name": "Alex"
}

✅ Решение

PHP имеет встроенные функции:

  • json_encode() – PHP → JSON
  • json_decode() – JSON → PHP

💻 Код

PHP → JSON (json_encode)

Используется для преобразования данных PHP в JSON.

Пример:

$user = [
    'name' => 'Alex',
    'age' => 25
];
 
$json = json_encode($user);
 
echo $json;

Результат:

{
    "name": "Alex",
    "age": 25
}

Красивое форматирование

По умолчанию JSON выводится в одну строку:

{"name":"Alex","age":25}

Для удобства:

$json = json_encode(
    $user,
    JSON_PRETTY_PRINT
);

Результат:

{
    "name": "Alex",
    "age": 25
}

JSON → PHP (json_decode)

Используется для получения данных из JSON.

Пример:

$json = '
{
    "name": "Alex",
    "age": 25
}
';
 
$data = json_decode($json);

По умолчанию:

$data->name;

Результат:

Alex

Преобразование в массив

Часто удобнее работать с массивами.

Для этого второй параметр:

$data = json_decode(
    $json,
    true
);

Теперь:

echo $data['name'];

Разница

Объект:

$data->name;

Получаем:

stdClass Object

Массив:

$data['name'];

Получаем:

Array

Работа с JSON-файлами

Частый сценарий:

config.json

Содержимое:

{
    "theme": "dark",
    "language": "ru"
}

Чтение JSON-файла

$json = file_get_contents(
    'config.json'
);
 
$config = json_decode(
    $json,
    true
);

Теперь:

echo $config['theme'];

Запись JSON-файла

$config = [
    'theme' => 'dark',
    'language' => 'ru'
];
 
$json = json_encode(
    $config,
    JSON_PRETTY_PRINT
);
 
file_put_contents(
    'config.json',
    $json
);

JSON в API

Обычно сервер получает JSON из HTTP-запроса.

Например:

{
    "email": "user@test.com",
    "password": "123456"
}

В PHP:

$input = file_get_contents(
    'php://input'
);
 
$data = json_decode(
    $input,
    true
);

Теперь:

$email = $data['email'];

Отправка JSON-ответа

Например, API возвращает пользователя:

$user = [
    'id' => 1,
    'name' => 'Alex'
];
 
echo json_encode($user);

Но правильнее указать заголовок:

header(
    'Content-Type: application/json'
);
 
echo json_encode($user);

Теперь клиент понимает:

Ответ сервера = JSON

Ошибки JSON

JSON может быть некорректным.

Например:

{
    "name": "Alex",
}

Лишняя запятая делает JSON невалидным.

Проверка:

$data = json_decode($json);
 
if (json_last_error()) {
    echo "Ошибка JSON";
}

Современный вариант

Использовать:

JSON_THROW_ON_ERROR

Пример:

$data = json_decode(
    $json,
    true,
    512,
    JSON_THROW_ON_ERROR
);

Теперь PHP выбросит исключение:

JsonException

которое можно обработать:

try {
    $data = json_decode(
        $json,
        true,
        512,
        JSON_THROW_ON_ERROR
    );
} catch (JsonException $e) {
    echo $e->getMessage();
}

Работа с Unicode

По умолчанию:

echo json_encode([
    'name' => 'Иван'
]);

может вернуть:

{
    "name": "\u0418\u0432\u0430\u043d"
}

Чтобы оставить обычный текст:

json_encode(
    $data,
    JSON_UNESCAPED_UNICODE
);

Результат:

{
    "name": "Иван"
}

JSON и типы данных

JSON поддерживает:

PHPJSON
stringstring
int/floatnumber
boolboolean
nullnull
arrayarray/object
objectobject
Пример:

PHP:

$data = [
    'active' => true,
    'count' => 10,
    'value' => null
];

JSON:

{
    "active": true,
    "count": 10,
    "value": null
}

Частые ошибки

Не проверять результат json_decode

Плохо:

$data = json_decode($json);
 
echo $data->name;

Если JSON сломан:

  • будет ошибка
  • данные будут недоступны

Лучше:

try {
    $data = json_decode(
        $json,
        true,
        512,
        JSON_THROW_ON_ERROR
    );
}
catch (JsonException $e) {
    // обработка ошибки
}

Забывать второй параметр true

Частая ошибка:

$data = json_decode($json);
 
echo $data['name'];

Ошибка:

Cannot use object as array

Нужно:

$data = json_decode(
    $json,
    true
);

Хранить секреты в JSON

Плохо:

{
    "password": "123456"
}

Особенно если файл попадает в репозиторий.

Лучше:

  • .env
  • переменные окружения
  • секрет-хранилища

JSON vs сериализация PHP

PHP имеет:

serialize()
unserialize()

Но JSON чаще используют для:

  • API
  • обмена данными
  • конфигов
  • frontend/backend взаимодействия

Потому что JSON:

  • читается человеком
  • поддерживается любым языком
  • является стандартом веба

🎯 Вывод

  • JSON – основной формат обмена данными между системами
  • json_encode() преобразует PHP в JSON
  • json_decode() преобразует JSON в PHP
  • второй параметр true превращает объект в массив
  • для API нужно указывать Content-Type: application/json
  • JSON_THROW_ON_ERROR позволяет нормально обрабатывать ошибки
  • JSON часто используется для API, конфигураций и хранения данных
  • секретные данные не стоит хранить в JSON-файлах

🔗 Связано