Введение: почему «грязный» JSON — враг любого разработчика
Представьте: вы пишете API на PHP, возвращаете данные в формате JSON, открываете результат в браузере или консоли — и видите одну сплошную строку без единого пробела:
{"users":[{"id":1,"name":"Иван","email":"ivan@example.com"},{"id":2,"name":"Мария","email":"maria@example.com"}]}
Глаза разбегаются, найти нужное поле невозможно, а если JSON содержит ошибку — вы будете искать её часами. Знакомая ситуация? Именно поэтому на Stack Overflow вопрос «Pretty-Printing JSON with PHP» набрал тысячи просмотров. Сегодня мы раз и навсегда разберёмся, как сделать JSON читаемым, структурированным и красивым с помощью PHP.
В этой статье вы узнаете:
- Что такое pretty-printing и зачем он нужен
- Как использовать встроенную функцию
json_encodeс флагами - Как форматировать JSON для отладки, логов и вывода в браузер
- Дополнительные приёмы: рекурсивное форматирование, работа с Unicode и сжатие
Поехали!
Что такое pretty-printing JSON?
Pretty-printing (от англ. «красивая печать») — это форматирование данных с отступами, переносами строк и выравниванием, чтобы человек мог легко прочитать структуру. В случае с JSON это превращает «кашу» в аккуратную иерархию:
{
"users": [
{
"id": 1,
"name": "Иван",
"email": "ivan@example.com"
},
{
"id": 2,
"name": "Мария",
"email": "maria@example.com"
}
]
}
Согласитесь, так гораздо приятнее работать! PHP предоставляет для этого встроенные инструменты, которые не требуют установки дополнительных библиотек.
Основной способ: json_encode с флагом JSON_PRETTY_PRINT
Самый простой и распространённый метод — использовать второй параметр функции json_encode(), передав константу JSON_PRETTY_PRINT. Вот базовый пример:
<?php
$data = [
'name' => 'PythonLib',
'type' => 'educational',
'topics' => ['PHP', 'Python', 'JavaScript'],
'stats' => [
'visitors' => 15000,
'rating' => 4.8
]
];
$prettyJson = json_encode($data, JSON_PRETTY_PRINT);
echo $prettyJson;
?>
Результат:
{
"name": "PythonLib",
"type": "educational",
"topics": [
"PHP",
"Python",
"JavaScript"
],
"stats": {
"visitors": 15000,
"rating": 4.8
}
}
Обратите внимание: ключи сортируются в алфавитном порядке. Если вам нужно сохранить исходный порядок — используйте флаг JSON_PRESERVE_ZERO_FRACTION (для чисел с плавающей точкой) или сортируйте массив вручную.
Комбинирование флагов
Вы можете передавать несколько флагов через | (побитовое ИЛИ). Например, чтобы одновременно форматировать и экранировать Unicode-символы:
$json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $json;
Флаг JSON_UNESCAPED_UNICODE сохраняет кириллицу и другие символы в читаемом виде, а не в виде \u0438\u0432\u0430\u043d. Это особенно полезно для русскоязычных сайтов.
Как вывести pretty-printed JSON в браузере
Если вы разрабатываете API и хотите, чтобы JSON отображался красиво прямо в браузере (например, при отладке), используйте заголовок Content-Type: application/json вместе с форматированием:
<?php
header('Content-Type: application/json; charset=utf-8');
$response = [
'status' => 'success',
'data' => [
'message' => 'Привет, мир!',
'code' => 200
]
];
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>
Теперь, если открыть скрипт в браузере, вы увидите аккуратный, отформатированный JSON с отступами. Многие браузеры (Chrome, Firefox) также подсвечивают синтаксис, если заголовок установлен правильно.
Совет: не злоупотребляйте pretty-print в production
В боевом режиме лучше отдавать «сжатый» JSON (без лишних пробелов), чтобы уменьшить размер передаваемых данных. Для отладки и разработки — форматирование незаменимо. Решение: добавьте параметр ?pretty=true в URL вашего API:
$isPretty = isset($_GET['pretty']) && $_GET['pretty'] === 'true';
$flags = $isPretty ? JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE : JSON_UNESCAPED_UNICODE;
echo json_encode($data, $flags);
Форматирование JSON из строки: json_decode + json_encode
Иногда у вас уже есть JSON в виде строки (например, из базы данных или внешнего API), и его нужно «причесать». Алгоритм прост:
- Декодируем строку в массив или объект с помощью
json_decode() - Кодируем обратно с флагом
JSON_PRETTY_PRINT
Пример:
<?php
$uglyJson = '{"name":"Анна","age":28,"hobbies":["чтение","путешествия","фотография"]}';
$decoded = json_decode($uglyJson, true); // true — получаем ассоциативный массив
$prettyJson = json_encode($decoded, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $prettyJson;
?>
Результат:
{
"name": "Анна",
"age": 28,
"hobbies": [
"чтение",
"путешествия",
"фотография"
]
}
Важно: если исходный JSON содержит ошибки (например, лишние запятые), json_decode() вернёт null. Всегда проверяйте результат:
$decoded = json_decode($uglyJson, true);
if ($decoded === null && json_last_error() !== JSON_ERROR_NONE) {
echo 'Ошибка при декодировании JSON: ' . json_last_error_msg();
} else {
echo json_encode($decoded, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
Глубокое форматирование: управление отступами
По умолчанию JSON_PRETTY_PRINT использует 4 пробела для отступов. Но что, если вам нужно 2 пробела или табуляция? К сожалению, стандартный PHP не позволяет менять отступы напрямую