Введение в 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);
// Модификация данных