Как красиво вывести JSON в PHP: полный гайд для новичков

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

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

Начать курс

Введение: почему «грязный» 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), и его нужно «причесать». Алгоритм прост:

  1. Декодируем строку в массив или объект с помощью json_decode()
  2. Кодируем обратно с флагом 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 не позволяет менять отступы напрямую

Блоги

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