Введение: почему JSON в PHP выглядит как каша?
Представьте ситуацию: вы написали на PHP скрипт, который получает данные от API или формирует ответ для фронтенда. Вы выводите результат с помощью echo json_encode($data) — и получаете в браузере или консоли что-то вроде:
{"users":[{"id":1,"name":"Иван","email":"ivan@example.com"},{"id":2,"name":"Мария","email":"maria@example.com"}]}
Согласитесь, читать эту строку без форматирования — то же самое, что пытаться разобрать рукопись врача. Особенно если данных много, а вложенность глубокая. Именно здесь на помощь приходит pretty-printing JSON в PHP.
Эта статья — для тех, кто только начинает работать с PHP и JSON. Мы разберём, как сделать вывод JSON красивым, читаемым и удобным для отладки. Вы узнаете не только базовые методы, но и полезные лайфхаки, которые сэкономят вам часы нервов. Поехали!
Что такое pretty-print и зачем он нужен?
Pretty-print (дословно — «красивая печать») — это форматирование данных с отступами, переносами строк и выравниванием. В случае с JSON это означает, что вместо одной длинной строки вы получите структурированный вывод, где каждый ключ и значение находятся на своём месте.
Представьте, что вы отлаживаете API-запрос или проверяете конфигурационный файл. Без pretty-print вы потратите уйму времени, пытаясь понять, где заканчивается один объект и начинается другой. С форматированием — всё как на ладони.
В PHP есть несколько способов добиться красивого вывода JSON. Мы начнём с самого простого и популярного — использования флага JSON_PRETTY_PRINT.
Метод 1: JSON_PRETTY_PRINT — ваш лучший друг
Самый простой способ сделать pretty-print JSON в PHP — использовать константу JSON_PRETTY_PRINT при вызове функции json_encode(). Эта константа доступна начиная с PHP 5.4.0.
Базовый пример
<?php
$data = [
'users' => [
['id' => 1, 'name' => 'Иван', 'email' => 'ivan@example.com'],
['id' => 2, 'name' => 'Мария', 'email' => 'maria@example.com']
]
];
$json = json_encode($data, JSON_PRETTY_PRINT);
echo $json;
?>
Результат:
{
"users": [
{
"id": 1,
"name": "Иван",
"email": "ivan@example.com"
},
{
"id": 2,
"name": "Мария",
"email": "maria@example.com"
}
]
}
Уже гораздо лучше, правда? Каждый элемент массива теперь на отдельной строке, отступы расставлены, структура читается интуитивно.
Комбинируем с другими флагами
JSON_PRETTY_PRINT можно и нужно комбинировать с другими флагами для более тонкой настройки. Например:
- JSON_UNESCAPED_UNICODE — не экранирует кириллицу и другие Unicode-символы (вместо
\u0438\u0432\u0430\u043dвы увидитеИван). - JSON_UNESCAPED_SLASHES — не экранирует косые черты (полезно для URL).
- JSON_NUMERIC_CHECK — преобразует строки, содержащие числа, в числовой тип.
<?php
$data = [
'message' => 'Привет, мир!',
'url' => 'https://example.com/api/v1/users'
];
$json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
echo $json;
?>
Результат:
{
"message": "Привет, мир!",
"url": "https://example.com/api/v1/users"
}
Обратите внимание: кириллица отображается нормально, слеши не экранированы. Именно так обычно и нужно выводить JSON для человека.
Метод 2: Форматирование уже существующей JSON-строки
А что делать, если у вас уже есть JSON-строка (например, полученная из файла или из базы данных), и её нужно красиво вывести? Просто вызвать json_encode() на строке — не сработает, потому что это будет двойное кодирование.
Правильный подход: сначала декодировать строку в массив или объект с помощью json_decode(), а потом снова закодировать с флагом JSON_PRETTY_PRINT.
<?php
$uglyJson = '{"users":[{"id":1,"name":"Иван","email":"ivan@example.com"}]}';
// Декодируем в массив (второй параметр true)
$decoded = json_decode($uglyJson, true);
// Кодируем обратно с форматированием
$prettyJson = json_encode($decoded, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $prettyJson;
?>
Результат:
{
"users": [
{
"id": 1,
"name": "Иван",
"email": "ivan@example.com"
}
]
}
Важно: если ваша JSON-строка повреждена (например, содержит лишнюю запятую или неверный синтаксис), json_decode() вернёт null. Всегда проверяйте результат:
<?php
$uglyJson = '{"name": "Иван",}'; // лишняя запятая
$decoded = json_decode($uglyJson, true);
if ($decoded === null && json_last_error() !== JSON_ERROR_NONE) {
echo 'Ошибка декодирования JSON: ' . json_last_error_msg();
} else {
$prettyJson = json_encode($decoded, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $prettyJson;
}
?>
Метод 3: Pretty-print для вывода в браузер
Когда вы выводите JSON в браузер (например, для отладки), не забудьте установить правильный заголовок Content-Type. Иначе браузер может попытаться интерпретировать JSON как HTML и скрыть форматирование.
<?php
header('Content-Type: application/json; charset=utf-8');
$data = [
'status' => 'success',
'data' => [
'id' => 42,
'name' => 'Тестовый пользователь'
]
];
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>
Теперь, если вы откроете этот скрипт в браузере, вы увидите красиво отформатированный JSON. Браузеры (Chrome, Firefox, Safari) умеют сворачивать и разворачивать узлы, что делает отладку ещё удобнее.
Метод 4: Pretty-print с сохранением в файл
Часто нужно не просто вывести JSON на экран, а