🧱 Суть
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 → JSONjson_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 поддерживает:
| PHP | JSON |
|---|---|
| string | string |
| int/float | number |
| bool | boolean |
| null | null |
| array | array/object |
| object | object |
| Пример: |
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 в JSONjson_decode()преобразует JSON в PHP- второй параметр
trueпревращает объект в массив - для API нужно указывать
Content-Type: application/json JSON_THROW_ON_ERRORпозволяет нормально обрабатывать ошибки- JSON часто используется для API, конфигураций и хранения данных
- секретные данные не стоит хранить в JSON-файлах