Работа с JSON в PHP: парсинг и сериализация для начинающих

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

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

Начать курс

Введение в JSON и PHP

JSON (JavaScript Object Notation) — это легкий формат обмена данными, который стал стандартом де-факто для взаимодействия между веб-серверами и клиентами. В современной веб-разработке на PHP вы будете сталкиваться с JSON повсеместно: от API-запросов до конфигурационных файлов и хранения структурированных данных.

В этой статье мы разберем два фундаментальных процесса работы с JSON в PHP:

  • Сериализация — преобразование PHP-массива или объекта в строку JSON (функция json_encode()).
  • Парсинг (десериализация) — обратное преобразование строки JSON в PHP-переменную (функция json_decode()).

Материал ориентирован на начинающих PHP-разработчиков, поэтому мы будем идти от простого к сложному, с подробными примерами кода.

Сериализация данных: функция json_encode()

Сериализация — это процесс преобразования данных из внутреннего представления PHP (массивы, объекты) в строку формата JSON. Это необходимо, когда вы хотите отправить данные клиенту (браузеру, мобильному приложению) или сохранить их в файл/базу данных в универсальном формате.

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

Самый простой случай — сериализация ассоциативного массива:

<?php
$user = [
    "name" => "Иван Петров",
    "age" => 28,
    "email" => "ivan@example.com",
    "is_active" => true
];

$jsonString = json_encode($user, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $jsonString;
?>

Результат выполнения:

{
    "name": "Иван Петров",
    "age": 28,
    "email": "ivan@example.com",
    "is_active": true
}

Обратите внимание на флаги:

  • JSON_UNESCAPED_UNICODE — позволяет сохранить кириллицу (без этого флага русские символы будут преобразованы в \uXXXX).
  • JSON_PRETTY_PRINT — форматирует вывод с отступами для удобочитаемости (полезно для отладки, но увеличивает размер строки).

Преобразование объекта в JSON

PHP-объекты также можно сериализовать. При этом будут включены только public-свойства:

<?php
class Product {
    public $id;
    public $title;
    private $secretPrice; // не будет включено в JSON

    public function __construct($id, $title, $price) {
        $this->id = $id;
        $this->title = $title;
        $this->secretPrice = $price;
    }
}

$product = new Product(1, "Ноутбук", 75000);
echo json_encode($product, JSON_UNESCAPED_UNICODE);
// Вывод: {"id":1,"title":"Ноутбук"}
?>

Работа с вложенными структурами

JSON поддерживает вложенность. PHP-массивы любой глубины корректно преобразуются:

<?php
$data = [
    "company" => "TechCorp",
    "employees" => [
        ["name" => "Анна", "position" => "Разработчик"],
        ["name" => "Борис", "position" => "Дизайнер"]
    ],
    "address" => [
        "city" => "Москва",
        "street" => "Тверская"
    ]
];

echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>

Парсинг JSON: функция json_decode()

Парсинг (десериализация) — это обратный процесс: из строки JSON мы получаем данные, с которыми может работать PHP.

Получение объекта

По умолчанию json_decode() возвращает объект класса stdClass:

<?php
$jsonString = '{"name":"Иван Петров","age":28,"email":"ivan@example.com"}';
$user = json_decode($jsonString);

echo $user->name;    // Иван Петров
echo $user->age;     // 28
echo $user->email;   // ivan@example.com
?>

Получение массива

Если передать второй аргумент true, функция вернет ассоциативный массив:

<?php
$jsonString = '{"name":"Иван Петров","age":28,"email":"ivan@example.com"}';
$userArray = json_decode($jsonString, true);

echo $userArray['name'];  // Иван Петров
echo $userArray['age'];   // 28
?>

Рекомендуется использовать true (массив), если вы привыкли работать с массивами — это делает код более предсказуемым.

Парсинг вложенных JSON

Сложные структуры парсятся рекурсивно:

<?php
$jsonString = '{
    "company": "TechCorp",
    "employees": [
        {"name": "Анна", "position": "Разработчик"},
        {"name": "Борис", "position": "Дизайнер"}
    ]
}';

$data = json_decode($jsonString, true);

// Доступ к вложенным данным
echo $data['employees'][0]['name']; // Анна
echo $data['employees'][1]['position']; // Дизайнер
?>

Обработка ошибок и продвинутые приемы

Проверка на ошибки парсинга

При работе с внешними данными (например, из API) всегда нужно проверять, что JSON корректен. Используйте json_last_error():

<?php
$badJson = '{"name": "Тест, without closing brace';

$data = json_decode($badJson, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    echo "Ошибка парсинга JSON: " . json_last_error_msg();
    // Вывод: Ошибка парсинга JSON: Syntax error
} else {
    print_r($data);
}
?>

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

Часто JSON данные хранятся в файлах. Пример чтения и записи:

<?php
// Чтение из файла
$jsonContent = file_get_contents('data.json');
$config = json_decode($jsonContent, true);

// Модификация данных                

Блоги

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