Pretty-Printing JSON с PHP

589

Я строю PHP-скрипт, который передает данные JSON в другой скрипт. Мой скрипт строит данные в большой ассоциативный массив, а затем выводит данные, используя json_encode. Вот пример сценария:

$data = array('a' => 'apple', 'b' => 'banana', 'c' => 'catnip');
header('Content-type: text/javascript');
echo json_encode($data);

Приведенный выше код дает следующий вывод:

{"a":"apple","b":"banana","c":"catnip"}

Это замечательно, если у вас небольшой объем данных, но я бы предпочел что-то вроде этого:

{
    "a": "apple",
    "b": "banana",
    "c": "catnip"
}

Есть ли способ сделать это в PHP без отвратительного взлома? Похоже, кто-то в Facebook понял это.

Зак Раттнер
источник
26
Для PHP до 5.4 вы можете использовать запасной вариант в upgradephp asup_json_encode($data, JSON_PRETTY_PRINT);
mario
6
использование заголовка («Content-Type: application / json»); делает браузер довольно печатным
partho
4
Начиная с июля 2018 года, просто отправив Content-Type: application/jsonзаголовок, Firefox покажет результат, используя собственный внутренний анализатор JSON, а Chrome показывает простой текст. +1 Firefox!
andreszs

Ответы:

1127

PHP 5.4 предлагает JSON_PRETTY_PRINTопцию для использования с json_encode()вызовом.

http://php.net/manual/en/function.json-encode.php

<?php
...
$json_string = json_encode($data, JSON_PRETTY_PRINT);
ekillaby
источник
33
Спасибо, это лучший способ сделать это сейчас. У меня не было php 5.4, когда я задал этот вопрос ...
Зак Раттнер
9
5.5.3, здесь, кажется, добавляется небольшой интервал между символами, а не отступ.
35
JSON не должен содержать разрывов строк HTML, тогда как символы новой строки допустимы в JSON. Если вы хотите отобразить JSON на веб-странице, сделайте замену строки для символов новой строки самостоятельно или вставьте JSON в элемент <pre> ... </ pre>. См. Json.org для ссылки на синтаксис.
ekillaby
13
Не забудьте установить ответ Content-Typeна , application/jsonесли вы хотите браузер для отображения довольно-печатное JSON красиво.
Пиюсн
6
@countfloortiles, это не сработает напрямую, вам нужно заключить вывод в <pre>тег вроде:<?php ... $json_string = json_encode($data, JSON_PRETTY_PRINT); echo "<pre>".$json_string."<pre>";
Салман Мохаммад
187

Эта функция будет принимать строку JSON и делать отступ для очень удобного для чтения. Это также должно быть сходящимся,

prettyPrint( $json ) === prettyPrint( prettyPrint( $json ) )

вход

{"key1":[1,2,3],"key2":"value"}

Вывод

{
    "key1": [
        1,
        2,
        3
    ],
    "key2": "value"
}

Код

function prettyPrint( $json )
{
    $result = '';
    $level = 0;
    $in_quotes = false;
    $in_escape = false;
    $ends_line_level = NULL;
    $json_length = strlen( $json );

    for( $i = 0; $i < $json_length; $i++ ) {
        $char = $json[$i];
        $new_line_level = NULL;
        $post = "";
        if( $ends_line_level !== NULL ) {
            $new_line_level = $ends_line_level;
            $ends_line_level = NULL;
        }
        if ( $in_escape ) {
            $in_escape = false;
        } else if( $char === '"' ) {
            $in_quotes = !$in_quotes;
        } else if( ! $in_quotes ) {
            switch( $char ) {
                case '}': case ']':
                    $level--;
                    $ends_line_level = NULL;
                    $new_line_level = $level;
                    break;

                case '{': case '[':
                    $level++;
                case ',':
                    $ends_line_level = $level;
                    break;

                case ':':
                    $post = " ";
                    break;

                case " ": case "\t": case "\n": case "\r":
                    $char = "";
                    $ends_line_level = $new_line_level;
                    $new_line_level = NULL;
                    break;
            }
        } else if ( $char === '\\' ) {
            $in_escape = true;
        }
        if( $new_line_level !== NULL ) {
            $result .= "\n".str_repeat( "\t", $new_line_level );
        }
        $result .= $char.$post;
    }

    return $result;
}
Кендалл Хопкинс
источник
84

Многие пользователи предложили вам использовать

echo json_encode($results, JSON_PRETTY_PRINT);

Что абсолютно верно. Но этого недостаточно, браузер должен понимать тип данных, вы можете указать заголовок непосредственно перед отправкой данных пользователю.

header('Content-Type: application/json');

Это приведет к хорошо отформатированному выводу.

Или, если вам нравятся расширения, вы можете использовать JSONView для Chrome.

Вахиб Закрауи
источник
3
Только установите заголовок, и Firefox прекрасно покажет его, используя собственный внутренний анализатор отладки JSON, не нужно прикасаться к содержимому JSON вообще! Спасибо!!
andreszs
1
тоже работает в хроме. Спасибо.
Дон Диланга
41

Я была такая же проблема.

В любом случае, я просто использовал код форматирования json:

http://recursive-design.com/blog/2008/03/11/format-json-with-php/

Хорошо работает для того, что мне нужно.

И более поддерживаемая версия: https://github.com/GerHobbelt/nicejson-php

Джейсон
источник
Я попробовал github.com/GerHobbelt/nicejson-php, и он прекрасно работает в PHP 5.3.
Профессор Фалькен нарушил контракт
1
Если вы используете PHP7.0 (и выше) и вам все еще нужно печатать JSON с индивидуальным отступом, localheinz.com/blog/2018/01/04/… должен помочь.
localheinz
40

Я понимаю, что этот вопрос задает вопрос о том, как кодировать ассоциативный массив в довольно отформатированную строку JSON, так что это не дает прямого ответа на вопрос, но если у вас есть строка в формате JSON, вы можете сделать ее довольно просто путем декодирования и перекодирования (требуется PHP> = 5.4):

$json = json_encode(json_decode($json), JSON_PRETTY_PRINT);

Пример:

header('Content-Type: application/json');
$json_ugly = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
$json_pretty = json_encode(json_decode($json_ugly), JSON_PRETTY_PRINT);
echo $json_pretty;

Это выводит:

{
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4,
    "e": 5
}
Майк
источник
спасибо, это работает, только если я добавлю это в начало блока php… header ('Content-Type: application / json');
DeyaEldeen
2
@DeyaEldeen Если вы не используете этот заголовок, PHP сообщит браузеру, что он отправляет HTML, поэтому вам нужно будет просмотреть исходный код страницы, чтобы увидеть отформатированную строку JSON. Я предполагал, что это поняли, но я думаю, что нет. Я добавил это в свой ответ.
Майк
И любой, кто следит / просматривает журнал / файл в оболочке unix / linux, это решение здесь! Хороший внешний вид, @Mike, позволяет легко читать!
fusion27
@ fusion27 Я не совсем уверен, к каким файлам журналов вы обращаетесь. Я никогда не слышал ни о каких программах, которые бы что-нибудь регистрировали в JSON.
Майк
@Mike, это быстрый и грязный PHP, который я добавил, добавив тело запроса (которое представляет собой сериализованную строку JSON), помещенное в мой PHP в текстовый файл, затем я подключил его в оболочке unix, чтобы посмотреть POST в реальном времени. Я использую ваш трюк, чтобы отформатировать этот JSON, делая текстовый файл более удобным для использования.
fusion27
25

Склейка нескольких ответов соответствует моей потребности в существующем json:

Code:
echo "<pre>"; 
echo json_encode(json_decode($json_response), JSON_PRETTY_PRINT); 
echo "</pre>";

Output:
{
    "data": {
        "token_type": "bearer",
        "expires_in": 3628799,
        "scopes": "full_access",
        "created_at": 1540504324
    },
    "errors": [],
    "pagination": {},
    "token_type": "bearer",
    "expires_in": 3628799,
    "scopes": "full_access",
    "created_at": 1540504324
}
Kevin
источник
3
Вот небольшая функция-обертка, чтобы сделать это:function json_print($json) { return '<pre>' . json_encode(json_decode($json), JSON_PRETTY_PRINT) . '</pre>'; }
Дэнни Беккет
11

Я взял код у Composer: https://github.com/composer/composer/blob/master/src/Composer/Json/JsonFile.php и nicejson: https://github.com/GerHobbelt/nicejson-php/blob /master/nicejson.php Код Composer хорош, потому что он свободно обновляется с 5.3 до 5.4, но кодирует только объект, тогда как nicejson принимает строки json, поэтому я объединил их. Код можно использовать для форматирования строки json и / или кодирования объектов, в настоящее время я использую его в модуле Drupal.

if (!defined('JSON_UNESCAPED_SLASHES'))
    define('JSON_UNESCAPED_SLASHES', 64);
if (!defined('JSON_PRETTY_PRINT'))
    define('JSON_PRETTY_PRINT', 128);
if (!defined('JSON_UNESCAPED_UNICODE'))
    define('JSON_UNESCAPED_UNICODE', 256);

function _json_encode($data, $options = 448)
{
    if (version_compare(PHP_VERSION, '5.4', '>='))
    {
        return json_encode($data, $options);
    }

    return _json_format(json_encode($data), $options);
}

function _pretty_print_json($json)
{
    return _json_format($json, JSON_PRETTY_PRINT);
}

function _json_format($json, $options = 448)
{
    $prettyPrint = (bool) ($options & JSON_PRETTY_PRINT);
    $unescapeUnicode = (bool) ($options & JSON_UNESCAPED_UNICODE);
    $unescapeSlashes = (bool) ($options & JSON_UNESCAPED_SLASHES);

    if (!$prettyPrint && !$unescapeUnicode && !$unescapeSlashes)
    {
        return $json;
    }

    $result = '';
    $pos = 0;
    $strLen = strlen($json);
    $indentStr = ' ';
    $newLine = "\n";
    $outOfQuotes = true;
    $buffer = '';
    $noescape = true;

    for ($i = 0; $i < $strLen; $i++)
    {
        // Grab the next character in the string
        $char = substr($json, $i, 1);

        // Are we inside a quoted string?
        if ('"' === $char && $noescape)
        {
            $outOfQuotes = !$outOfQuotes;
        }

        if (!$outOfQuotes)
        {
            $buffer .= $char;
            $noescape = '\\' === $char ? !$noescape : true;
            continue;
        }
        elseif ('' !== $buffer)
        {
            if ($unescapeSlashes)
            {
                $buffer = str_replace('\\/', '/', $buffer);
            }

            if ($unescapeUnicode && function_exists('mb_convert_encoding'))
            {
                // http://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha
                $buffer = preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
                    function ($match)
                    {
                        return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
                    }, $buffer);
            } 

            $result .= $buffer . $char;
            $buffer = '';
            continue;
        }
        elseif(false !== strpos(" \t\r\n", $char))
        {
            continue;
        }

        if (':' === $char)
        {
            // Add a space after the : character
            $char .= ' ';
        }
        elseif (('}' === $char || ']' === $char))
        {
            $pos--;
            $prevChar = substr($json, $i - 1, 1);

            if ('{' !== $prevChar && '[' !== $prevChar)
            {
                // If this character is the end of an element,
                // output a new line and indent the next line
                $result .= $newLine;
                for ($j = 0; $j < $pos; $j++)
                {
                    $result .= $indentStr;
                }
            }
            else
            {
                // Collapse empty {} and []
                $result = rtrim($result) . "\n\n" . $indentStr;
            }
        }

        $result .= $char;

        // If the last character was the beginning of an element,
        // output a new line and indent the next line
        if (',' === $char || '{' === $char || '[' === $char)
        {
            $result .= $newLine;

            if ('{' === $char || '[' === $char)
            {
                $pos++;
            }

            for ($j = 0; $j < $pos; $j++)
            {
                $result .= $indentStr;
            }
        }
    }
    // If buffer not empty after formating we have an unclosed quote
    if (strlen($buffer) > 0)
    {
        //json is incorrectly formatted
        $result = false;
    }

    return $result;
}
ulk200
источник
Вот как это делается! Собственная реализация запускается, только если native не доступен. Если вы уверены, что ваш код будет работать только на PHP 5.4 или выше, вы можете использовать JSON_PRETTY_PRINT
Heroselohim
Это решение дает мне ошибку (Ошибка разбора: синтаксическая ошибка, неожиданный T_FUNCTION) в функции строки ($ match)
ARLabs
Композитор взял это от daveperrett.com/articles/2008/03/11/format-json-with-php , который является таким же как stackoverflow.com/a/6054389/1172545 .
localheinz
10

Если вы используете Firefox, установите JSONovich . Я знаю, что это не совсем PHP-решение, но оно подходит для целей разработки / отладки.

Джей Сидри
источник
3
Я думаю, что это правильное решение для разработки API. Это дает лучшее из обоих миров, простую отладку, так как вы можете читать все, и вы не изменяете поведение бэкэнда, включая его производительность.
Даниэль
Согласитесь, он красиво отформатирован с помощью цветов и также может быть разборным. Гораздо приятнее, чем вы могли бы надеяться достичь с помощью небольшого количества PHP
Мэтью Локк
10

Я использовал это:

echo "<pre>".json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)."</pre>";

Или используйте заголовки php, как показано ниже:

header('Content-type: application/json; charset=UTF-8');
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
Сейфер Ахмед
источник
8

Простой способ для php> 5.4: как в графике Facebook

$Data = array('a' => 'apple', 'b' => 'banana', 'c' => 'catnip');
$json= json_encode($Data, JSON_PRETTY_PRINT);
header('Content-Type: application/json');
print_r($json);

Результат в браузере

{
    "a": "apple",
    "b": "banana",
    "c": "catnip"
}
dknepa
источник
@ Madbreaks, он хорошо печатается в php-файле, не нужно писать в json-файле, как в Facebook.
Дкнепа
6

Используйте <pre>в сочетании с json_encode()и JSON_PRETTY_PRINTопцией:

<pre>
    <?php
    echo json_encode($dataArray, JSON_PRETTY_PRINT);
    ?>
</pre>
Andreas
источник
6

Если у вас есть JSON ( $ugly_json)

echo nl2br(str_replace(' ', '&nbsp;', (json_encode(json_decode($ugly_json), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES))));
gvanto
источник
5

Полноценный вывод цвета: Tiny Solution

Код:

$s = '{"access": {"token": {"issued_at": "2008-08-16T14:10:31.309353", "expires": "2008-08-17T14:10:31Z", "id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"}, "serviceCatalog": [], "user": {"username": "ajay", "roles_links": [], "id": "16452ca89", "roles": [], "name": "ajay"}}}';

$crl = 0;
$ss = false;
echo "<pre>";
for($c=0; $c<strlen($s); $c++)
{
    if ( $s[$c] == '}' || $s[$c] == ']' )
    {
        $crl--;
        echo "\n";
        echo str_repeat(' ', ($crl*2));
    }
    if ( $s[$c] == '"' && ($s[$c-1] == ',' || $s[$c-2] == ',') )
    {
        echo "\n";
        echo str_repeat(' ', ($crl*2));
    }
    if ( $s[$c] == '"' && !$ss )
    {
        if ( $s[$c-1] == ':' || $s[$c-2] == ':' )
            echo '<span style="color:#0000ff;">';
        else
            echo '<span style="color:#ff0000;">';
    }
    echo $s[$c];
    if ( $s[$c] == '"' && $ss )
        echo '</span>';
    if ( $s[$c] == '"' )
          $ss = !$ss;
    if ( $s[$c] == '{' || $s[$c] == '[' )
    {
        $crl++;
        echo "\n";
        echo str_repeat(' ', ($crl*2));
    }
}
echo $s[$c];
J Ajay
источник
это было очень полезно, хотя в нем было несколько ошибок. Я исправил их, и теперь он работает как шарм, и функция не так уж велика! спасибо Ajay
Даниэль
просто чтобы прокомментировать исправления, если кто-то захочет использовать это ... добавьте проверочную проверку $ c> 1 во втором и третьем условии if, а последний эхо оберните его в is_array ($ s) if. это должно покрыть это, и вы не должны получить никакой ошибки смещения неинициализированной строки.
Даниэль
5

Вы можете немного изменить ответ Кендалла Хопкинса в операторе switch, чтобы получить довольно чистый и красиво отпечатанный отпечаток, передав строку json в следующее:

function prettyPrint( $json ){

$result = '';
$level = 0;
$in_quotes = false;
$in_escape = false;
$ends_line_level = NULL;
$json_length = strlen( $json );

for( $i = 0; $i < $json_length; $i++ ) {
    $char = $json[$i];
    $new_line_level = NULL;
    $post = "";
    if( $ends_line_level !== NULL ) {
        $new_line_level = $ends_line_level;
        $ends_line_level = NULL;
    }
    if ( $in_escape ) {
        $in_escape = false;
    } else if( $char === '"' ) {
        $in_quotes = !$in_quotes;
    } else if( ! $in_quotes ) {
        switch( $char ) {
            case '}': case ']':
                $level--;
                $ends_line_level = NULL;
                $new_line_level = $level;
                $char.="<br>";
                for($index=0;$index<$level-1;$index++){$char.="-----";}
                break;

            case '{': case '[':
                $level++;
                $char.="<br>";
                for($index=0;$index<$level;$index++){$char.="-----";}
                break;
            case ',':
                $ends_line_level = $level;
                $char.="<br>";
                for($index=0;$index<$level;$index++){$char.="-----";}
                break;

            case ':':
                $post = " ";
                break;

            case "\t": case "\n": case "\r":
                $char = "";
                $ends_line_level = $new_line_level;
                $new_line_level = NULL;
                break;
        }
    } else if ( $char === '\\' ) {
        $in_escape = true;
    }
    if( $new_line_level !== NULL ) {
        $result .= "\n".str_repeat( "\t", $new_line_level );
    }
    $result .= $char.$post;
}

echo "RESULTS ARE: <br><br>$result";
return $result;

}

Теперь просто запустите функцию prettyPrint ($ your_json_string); встроенный в ваш php и наслаждайтесь распечаткой. Если вы минималист и не как скобки для какой - то причины, вы можете избавиться от тех , кто легко путем замены $char.="<br>";с $char="<br>";в верхних трех случаях переключателя на $ полукокса. Вот что вы получаете за вызов API Google Maps для города Калгари

RESULTS ARE: 

{
- - - "results" : [
- - -- - - {
- - -- - -- - - "address_components" : [
- - -- - -- - -- - - {
- - -- - -- - -- - -- - - "long_name" : "Calgary"
- - -- - -- - -- - -- - - "short_name" : "Calgary"
- - -- - -- - -- - -- - - "types" : [
- - -- - -- - -- - -- - -- - - "locality"
- - -- - -- - -- - -- - -- - - "political" ]
- - -- - -- - -- - - }
- - -- - -- - -
- - -- - -- - -- - - {
- - -- - -- - -- - -- - - "long_name" : "Division No. 6"
- - -- - -- - -- - -- - - "short_name" : "Division No. 6"
- - -- - -- - -- - -- - - "types" : [
- - -- - -- - -- - -- - -- - - "administrative_area_level_2"
- - -- - -- - -- - -- - -- - - "political" ]
- - -- - -- - -- - - }
- - -- - -- - -
- - -- - -- - -- - - {
- - -- - -- - -- - -- - - "long_name" : "Alberta"
- - -- - -- - -- - -- - - "short_name" : "AB"
- - -- - -- - -- - -- - - "types" : [
- - -- - -- - -- - -- - -- - - "administrative_area_level_1"
- - -- - -- - -- - -- - -- - - "political" ]
- - -- - -- - -- - - }
- - -- - -- - -
- - -- - -- - -- - - {
- - -- - -- - -- - -- - - "long_name" : "Canada"
- - -- - -- - -- - -- - - "short_name" : "CA"
- - -- - -- - -- - -- - - "types" : [
- - -- - -- - -- - -- - -- - - "country"
- - -- - -- - -- - -- - -- - - "political" ]
- - -- - -- - -- - - }
- - -- - -- - - ]
- - -- - -
- - -- - -- - - "formatted_address" : "Calgary, AB, Canada"
- - -- - -- - - "geometry" : {
- - -- - -- - -- - - "bounds" : {
- - -- - -- - -- - -- - - "northeast" : {
- - -- - -- - -- - -- - -- - - "lat" : 51.18383
- - -- - -- - -- - -- - -- - - "lng" : -113.8769511 }
- - -- - -- - -- - -
- - -- - -- - -- - -- - - "southwest" : {
- - -- - -- - -- - -- - -- - - "lat" : 50.84240399999999
- - -- - -- - -- - -- - -- - - "lng" : -114.27136 }
- - -- - -- - -- - - }
- - -- - -- - -
- - -- - -- - -- - - "location" : {
- - -- - -- - -- - -- - - "lat" : 51.0486151
- - -- - -- - -- - -- - - "lng" : -114.0708459 }
- - -- - -- - -
- - -- - -- - -- - - "location_type" : "APPROXIMATE"
- - -- - -- - -- - - "viewport" : {
- - -- - -- - -- - -- - - "northeast" : {
- - -- - -- - -- - -- - -- - - "lat" : 51.18383
- - -- - -- - -- - -- - -- - - "lng" : -113.8769511 }
- - -- - -- - -- - -
- - -- - -- - -- - -- - - "southwest" : {
- - -- - -- - -- - -- - -- - - "lat" : 50.84240399999999
- - -- - -- - -- - -- - -- - - "lng" : -114.27136 }
- - -- - -- - -- - - }
- - -- - -- - - }
- - -- - -
- - -- - -- - - "place_id" : "ChIJ1T-EnwNwcVMROrZStrE7bSY"
- - -- - -- - - "types" : [
- - -- - -- - -- - - "locality"
- - -- - -- - -- - - "political" ]
- - -- - - }
- - - ]

- - - "status" : "OK" }
Кекс
источник
Это действительно приятно, спасибо. Единственное, что я думаю добавить небольшое улучшение - это использовать переменную для: $ indent = "-----", затем использовать это (вместо "-----" в разных местах кода)
gvanto
3

Вы можете сделать это, как показано ниже.

$array = array(
   "a" => "apple",
   "b" => "banana",
   "c" => "catnip"
);

foreach ($array as $a_key => $a_val) {
   $json .= "\"{$a_key}\" : \"{$a_val}\",\n";
}

header('Content-Type: application/json');
echo "{\n"  .rtrim($json, ",\n") . "\n}";

Выше бы выводил вроде как в фейсбуке.

{
"a" : "apple",
"b" : "banana",
"c" : "catnip"
}
Джейк
источник
Что если a_valмассив или объект?
Зак Раттнер
1
Я ответил на пример, используя Json в вопросе, я скоро обновлю свой ответ.
Джейк
3

Классический кейс для рекурсивного решения. Вот мой:

class JsonFormatter {
    public static function prettyPrint(&$j, $indentor = "\t", $indent = "") {
        $inString = $escaped = false;
        $result = $indent;

        if(is_string($j)) {
            $bak = $j;
            $j = str_split(trim($j, '"'));
        }

        while(count($j)) {
            $c = array_shift($j);
            if(false !== strpos("{[,]}", $c)) {
                if($inString) {
                    $result .= $c;
                } else if($c == '{' || $c == '[') {
                    $result .= $c."\n";
                    $result .= self::prettyPrint($j, $indentor, $indentor.$indent);
                    $result .= $indent.array_shift($j);
                } else if($c == '}' || $c == ']') {
                    array_unshift($j, $c);
                    $result .= "\n";
                    return $result;
                } else {
                    $result .= $c."\n".$indent;
                } 
            } else {
                $result .= $c;
                $c == '"' && !$escaped && $inString = !$inString;
                $escaped = $c == '\\' ? !$escaped : false;
            }
        }

        $j = $bak;
        return $result;
    }
}

Применение:

php > require 'JsonFormatter.php';
php > $a = array('foo' => 1, 'bar' => 'This "is" bar', 'baz' => array('a' => 1, 'b' => 2, 'c' => '"3"'));
php > print_r($a);
Array
(
    [foo] => 1
    [bar] => This "is" bar
    [baz] => Array
        (
            [a] => 1
            [b] => 2
            [c] => "3"
        )

)
php > echo JsonFormatter::prettyPrint(json_encode($a));
{
    "foo":1,
    "bar":"This \"is\" bar",
    "baz":{
        "a":1,
        "b":2,
        "c":"\"3\""
    }
}

ура

Madbreaks
источник
3

Это решение делает JSON действительно красивым. Не совсем то, о чем просил OP, но он позволяет лучше визуализировать JSON.

/**
 * takes an object parameter and returns the pretty json format.
 * this is a space saving version that uses 2 spaces instead of the regular 4
 *
 * @param $in
 *
 * @return string
 */
function pretty_json ($in): string
{
  return preg_replace_callback('/^ +/m',
    function (array $matches): string
    {
      return str_repeat(' ', strlen($matches[0]) / 2);
    }, json_encode($in, JSON_PRETTY_PRINT | JSON_HEX_APOS)
  );
}

/**
 * takes a JSON string an adds colours to the keys/values
 * if the string is not JSON then it is returned unaltered.
 *
 * @param string $in
 *
 * @return string
 */

function markup_json (string $in): string
{
  $string  = 'green';
  $number  = 'darkorange';
  $null    = 'magenta';
  $key     = 'red';
  $pattern = '/("(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/';
  return preg_replace_callback($pattern,
      function (array $matches) use ($string, $number, $null, $key): string
      {
        $match  = $matches[0];
        $colour = $number;
        if (preg_match('/^"/', $match))
        {
          $colour = preg_match('/:$/', $match)
            ? $key
            : $string;
        }
        elseif ($match === 'null')
        {
          $colour = $null;
        }
        return "<span style='color:{$colour}'>{$match}</span>";
      }, str_replace(['<', '>', '&'], ['&lt;', '&gt;', '&amp;'], $in)
   ) ?? $in;
}

public function test_pretty_json_object ()
{
  $ob       = new \stdClass();
  $ob->test = 'unit-tester';
  $json     = pretty_json($ob);
  $expected = <<<JSON
{
  "test": "unit-tester"
}
JSON;
  $this->assertEquals($expected, $json);
}

public function test_pretty_json_str ()
{
  $ob   = 'unit-tester';
  $json = pretty_json($ob);
  $this->assertEquals("\"$ob\"", $json);
}

public function test_markup_json ()
{
  $json = <<<JSON
[{"name":"abc","id":123,"warnings":[],"errors":null},{"name":"abc"}]
JSON;
  $expected = <<<STR
[
  {
    <span style='color:red'>"name":</span> <span style='color:green'>"abc"</span>,
    <span style='color:red'>"id":</span> <span style='color:darkorange'>123</span>,
    <span style='color:red'>"warnings":</span> [],
    <span style='color:red'>"errors":</span> <span style='color:magenta'>null</span>
  },
  {
    <span style='color:red'>"name":</span> <span style='color:green'>"abc"</span>
  }
]
STR;

  $output = markup_json(pretty_json(json_decode($json)));
  $this->assertEquals($expected,$output);
}

}

pgee70
источник
2

Если вы использовали только $json_string = json_encode($data, JSON_PRETTY_PRINT);, вы получите в браузере что-то вроде этого (используя ссылку Facebook из вопроса :)): введите описание изображения здесь

но если вы использовали расширение Chrome, такое как JSONView (даже без опции PHP выше), то вы получите более удобочитаемое решение для отладки, где вы можете даже легко свернуть / свернуть каждый отдельный объект JSON, например: введите описание изображения здесь

Абдельхади
источник
1

print_r довольно печать для PHP

Пример PHP

function print_nice($elem,$max_level=10,$print_nice_stack=array()){
    if(is_array($elem) || is_object($elem)){
        if(in_array($elem,$print_nice_stack,true)){
            echo "<font color=red>RECURSION</font>";
            return;
        }
        $print_nice_stack[]=&$elem;
        if($max_level<1){
            echo "<font color=red>nivel maximo alcanzado</font>";
            return;
        }
        $max_level--;
        echo "<table border=1 cellspacing=0 cellpadding=3 width=100%>";
        if(is_array($elem)){
            echo '<tr><td colspan=2 style="background-color:#333333;"><strong><font color=white>ARRAY</font></strong></td></tr>';
        }else{
            echo '<tr><td colspan=2 style="background-color:#333333;"><strong>';
            echo '<font color=white>OBJECT Type: '.get_class($elem).'</font></strong></td></tr>';
        }
        $color=0;
        foreach($elem as $k => $v){
            if($max_level%2){
                $rgb=($color++%2)?"#888888":"#BBBBBB";
            }else{
                $rgb=($color++%2)?"#8888BB":"#BBBBFF";
            }
            echo '<tr><td valign="top" style="width:40px;background-color:'.$rgb.';">';
            echo '<strong>'.$k."</strong></td><td>";
            print_nice($v,$max_level,$print_nice_stack);
            echo "</td></tr>";
        }
        echo "</table>";
        return;
    }
    if($elem === null){
        echo "<font color=green>NULL</font>";
    }elseif($elem === 0){
        echo "0";
    }elseif($elem === true){
        echo "<font color=green>TRUE</font>";
    }elseif($elem === false){
        echo "<font color=green>FALSE</font>";
    }elseif($elem === ""){
        echo "<font color=green>EMPTY STRING</font>";
    }else{
        echo str_replace("\n","<strong><font color=red>*</font></strong><br>\n",$elem);
    }
}
Шелли Чен
источник
1

1 - json_encode($rows,JSON_PRETTY_PRINT); возвращает предварительно подтвержденные данные с символами новой строки. Это полезно для ввода в командной строке, но, как вы обнаружили, в браузере выглядит не так красиво. Браузер примет новые строки в качестве источника (и, следовательно, при просмотре исходного кода страницы действительно отобразится симпатичный JSON), но они не используются для форматирования вывода в браузерах. Браузеры требуют HTML.

2 - использовать этот fuction github

<?php
    /**
     * Formats a JSON string for pretty printing
     *
     * @param string $json The JSON to make pretty
     * @param bool $html Insert nonbreaking spaces and <br />s for tabs and linebreaks
     * @return string The prettified output
     * @author Jay Roberts
     */
    function _format_json($json, $html = false) {
        $tabcount = 0;
        $result = '';
        $inquote = false;
        $ignorenext = false;
        if ($html) {
            $tab = "&nbsp;&nbsp;&nbsp;&nbsp;";
            $newline = "<br/>";
        } else {
            $tab = "\t";
            $newline = "\n";
        }
        for($i = 0; $i < strlen($json); $i++) {
            $char = $json[$i];
            if ($ignorenext) {
                $result .= $char;
                $ignorenext = false;
            } else {
                switch($char) {
                    case '[':
                    case '{':
                        $tabcount++;
                        $result .= $char . $newline . str_repeat($tab, $tabcount);
                        break;
                    case ']':
                    case '}':
                        $tabcount--;
                        $result = trim($result) . $newline . str_repeat($tab, $tabcount) . $char;
                        break;
                    case ',':
                        $result .= $char . $newline . str_repeat($tab, $tabcount);
                        break;
                    case '"':
                        $inquote = !$inquote;
                        $result .= $char;
                        break;
                    case '\\':
                        if ($inquote) $ignorenext = true;
                        $result .= $char;
                        break;
                    default:
                        $result .= $char;
                }
            }
        }
        return $result;
    }
SXn
источник
0

Вот что сработало для меня:

Содержание test.php:

<html>
<body>
Testing JSON array output
  <pre>
  <?php
  $data = array('a'=>'apple', 'b'=>'banana', 'c'=>'catnip');
  // encode in json format 
  $data = json_encode($data);

  // json as single line
  echo "</br>Json as single line </br>";
  echo $data;
  // json as an array, formatted nicely
  echo "</br>Json as multiline array </br>";
  print_r(json_decode($data, true));
  ?>
  </pre>
</body>
</html>

вывод:

Testing JSON array output


Json as single line 
{"a":"apple","b":"banana","c":"catnip"}
Json as multiline array 
Array
(
    [a] => apple
    [b] => banana
    [c] => catnip
)

Также обратите внимание на использование тега «pre» в html.

Надеюсь, что это помогает кому-то

TBone
источник
2
Это не отвечает на вопрос. Вы выгружаете переменные, а не печатаете форматированный JSON.
Madbreaks
0

лучший способ отформатировать данные в формате JSON:

header('Content-type: application/json; charset=UTF-8');
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

Замените $ response вашими данными, которые необходимо преобразовать в JSON

Resad Indipa
источник
0

Для тех, кто использует PHP версии 5.3 или ранее, вы можете попробовать ниже:

$pretty_json = "<pre>".print_r(json_decode($json), true)."</pre>";

echo $pretty_json;
Кит Чиа
источник
-4

Если вы работаете с MVC

попробуйте сделать это в вашем контроллере

public function getLatestUsers() {
    header('Content-Type: application/json');
    echo $this->model->getLatestUsers(); // this returns json_encode($somedata, JSON_PRETTY_PRINT)
}

тогда, если вы вызовете / getLatestUsers, вы получите красивый вывод JSON;)

веб-мастер
источник
см. мой комментарий после эха, где он довольно приятный
веб-мастер
1
MVC - это тип разработки фреймворка, никак не связанный с выводом JSON.
Мачей Папроцки
это ответ от 2013 человек;)
веб-мастер