Работа с JSON в PHP: парсинг и сериализация на практике
JSON (JavaScript Object Notation) — это легкий формат обмена данными, который стал стандартом для веб-API и конфигурационных файлов. В PHP работа с JSON реализована нативно и не требует установки дополнительных расширений. В этой статье мы разберем, как выполнять парсинг и сериализацию JSON в PHP на реальных примерах, а также научимся обрабатывать ошибки и работать с вложенными структурами.
Что такое сериализация и парсинг JSON?
Прежде чем перейти к коду, давайте определим ключевые понятия:
- Сериализация — преобразование PHP-переменной (массива, объекта) в строку JSON.
- Парсинг (десериализация) — обратный процесс: преобразование строки JSON в PHP-переменную.
PHP предоставляет две основные функции для этих задач: json_encode() и json_decode(). Рассмотрим их подробнее.
Сериализация данных в JSON с помощью json_encode()
Функция json_encode() принимает PHP-значение (кроме ресурсов) и возвращает его JSON-представление. Рассмотрим базовый пример:
<?php
$user = [
'name' => 'Иван Петров',
'age' => 28,
'email' => 'ivan@example.com',
'is_active' => true
];
$json = json_encode($user);
echo $json;
// Вывод: {"name":"Иван Петров","age":28,"email":"ivan@example.com","is_active":true}
?>
По умолчанию json_encode() преобразует ассоциативные массивы в объекты JSON. Если нужно получить массив, используйте флаг JSON_FORCE_OBJECT:
<?php
$numbers = [10, 20, 30];
echo json_encode($numbers); // [10,20,30]
echo json_encode($numbers, JSON_FORCE_OBJECT); // {"0":10,"1":20,"2":30}
?>
Полезные флаги json_encode()
JSON_PRETTY_PRINT— форматирует вывод с отступами для читаемости.JSON_UNESCAPED_UNICODE— не экранирует символы Unicode (русские буквы).JSON_NUMERIC_CHECK— преобразует строки, содержащие числа, в числовой тип.
<?php
$data = ['product' => 'Книга', 'price' => '1500'];
// Красивый вывод с русскими символами
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
/*
{
"product": "Книга",
"price": "1500"
}
*/
// Автоматическое преобразование строки '1500' в число
echo json_encode($data, JSON_NUMERIC_CHECK);
// {"product":"Книга","price":1500}
?>
Парсинг JSON в PHP с помощью json_decode()
Функция json_decode() принимает строку JSON и преобразует её в PHP-переменную. Второй параметр $associative определяет, возвращать ли ассоциативный массив (true) или объект (false, по умолчанию).
<?php
$jsonString = '{"name":"Мария","age":25,"hobbies":["чтение","путешествия"]}';
// Парсинг в объект
$obj = json_decode($jsonString);
echo $obj->name; // Мария
echo $obj->hobbies[0]; // чтение
// Парсинг в ассоциативный массив
$arr = json_decode($jsonString, true);
echo $arr['age']; // 25
?>
Работа с вложенными структурами
JSON часто содержит вложенные объекты и массивы. Рассмотрим пример с API погоды:
<?php
$weatherJson = '{
"city": "Москва",
"temperature": {
"current": -5,
"feels_like": -8
},
"forecast": [
{"day": "Пн", "temp": -3},
{"day": "Вт", "temp": -1}
]
}';
$weather = json_decode($weatherJson, true);
echo "Текущая температура: " . $weather['temperature']['current'] . "°C\n";
echo "Ощущается как: " . $weather['temperature']['feels_like'] . "°C\n";
foreach ($weather['forecast'] as $day) {
echo "{$day['day']}: {$day['temp']}°C\n";
}
?>
Обработка ошибок при работе с JSON
На практике данные из внешних источников могут быть повреждены. PHP предоставляет функцию json_last_error() для проверки ошибок парсинга.
<?php
function safeJsonDecode(string $json, bool $assoc = false) {
$result = json_decode($json, $assoc);
if (json_last_error() !== JSON_ERROR_NONE) {
// Логируем ошибку
error_log('JSON decode error: ' . json_last_error_msg());
return null;
}
return $result;
}
// Пример с некорректным JSON
$badJson = '{"name": "Анна", "age": }';
$data = safeJsonDecode($badJson, true);
if ($data === null) {
echo "Ошибка парсинга JSON: " . json_last_error_msg();
}
// Вывод: Ошибка парсинга JSON: Syntax error
?>
Основные коды ошибок JSON
JSON_ERROR_NONE— ошибок нет.JSON_ERROR_SYNTAX— синтаксическая ошибка в JSON.JSON_ERROR_UTF8— некорректные символы UTF-8.JSON_ERROR_DEPTH— превышена максимальная глубина вложенности.
Практический пример: работа с REST API
Чаще всего JSON используется при взаимодействии с внешними API. Рассмотрим полный цикл: отправка запроса, получение ответа и обработка данных.
<?php
// Пример: получение списка пользователей с JSONPlaceholder
$apiUrl = 'https://jsonplaceholder.typicode.com/users';
// Инициализируем cURL
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json'
]);
$response = curl_exec($ch);