JSON обработка в PHP: полное руководство
JSON (JavaScript Object Notation) — это легковесный формат обмена данными, который стал стандартом для взаимодействия между клиентом и сервером. В PHP работа с JSON реализована нативно через встроенные функции json_encode() и json_decode(). В этой статье мы подробно разберём все аспекты обработки JSON в PHP: от базовых операций до продвинутых техник и обработки ошибок.
Основные функции для работы с JSON в PHP
PHP предоставляет два ключевых инструмента для обработки JSON:
- json_encode() — преобразует PHP-значение (массив, объект, строку) в JSON-строку.
- json_decode() — декодирует JSON-строку обратно в PHP-значение.
Пример базового использования json_encode()
<?php
// Исходные данные: ассоциативный массив
$data = [
'name' => 'Иван',
'age' => 30,
'skills' => ['PHP', 'JavaScript', 'Python']
];
// Кодируем в JSON
$jsonString = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $jsonString;
?>
Результат выполнения:
{
"name": "Иван",
"age": 30,
"skills": [
"PHP",
"JavaScript",
"Python"
]
}
Флаг JSON_UNESCAPED_UNICODE сохраняет кириллицу без экранирования, а JSON_PRETTY_PRINT форматирует вывод с отступами для читаемости.
Пример декодирования JSON в PHP
<?php
$jsonString = '{"name":"Анна","age":25,"city":"Москва"}';
// Декодируем в ассоциативный массив (второй аргумент true)
$array = json_decode($jsonString, true);
echo $array['name']; // Анна
echo $array['city']; // Москва
// Декодируем в объект (по умолчанию)
$object = json_decode($jsonString);
echo $object->name; // Анна
?>
Обработка ошибок при работе с JSON
При работе с внешними данными важно проверять корректность JSON. Для этого используйте json_last_error() и json_last_error_msg():
<?php
$invalidJson = '{name: "Ошибка"}'; // Невалидный JSON (нет кавычек у ключа)
$decoded = json_decode($invalidJson);
if (json_last_error() !== JSON_ERROR_NONE) {
$errorMsg = json_last_error_msg();
echo "Ошибка декодирования JSON: $errorMsg";
// Вывод: Ошибка декодирования JSON: Syntax error
}
?>
Работа с вложенными структурами
JSON отлично подходит для сложных иерархических данных. Рассмотрим пример с вложенными массивами и объектами:
<?php
$complexData = [
'users' => [
[
'id' => 1,
'name' => 'Петр',
'orders' => [
['product' => 'Ноутбук', 'price' => 75000],
['product' => 'Мышь', 'price' => 1500]
]
],
[
'id' => 2,
'name' => 'Мария',
'orders' => []
]
],
'total_orders' => 2
];
$json = json_encode($complexData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
file_put_contents('data.json', $json); // Сохраняем в файл
// Читаем обратно
$jsonFromFile = file_get_contents('data.json');
$restoredData = json_decode($jsonFromFile, true);
// Доступ к вложенным данным
echo $restoredData['users'][0]['orders'][0]['product']; // Ноутбук
?>
Продвинутые опции json_encode()
PHP поддерживает множество флагов для тонкой настройки кодирования:
JSON_FORCE_OBJECT— принудительно кодирует массив как объект.JSON_NUMERIC_CHECK— преобразует числовые строки в числа.JSON_UNESCAPED_SLASHES— не экранирует слэши.JSON_THROW_ON_ERROR— выбрасывает исключение при ошибке (PHP 7.3+).
<?php
$array = ['key' => 'value', 'number' => '123'];
// Без флагов
echo json_encode($array); // {"key":"value","number":"123"}
// С JSON_NUMERIC_CHECK
echo json_encode($