Работа с JSON в PHP: парсинг и сериализация на практике

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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);                

Блоги

Рекомендаций по книгам