Симпатичний друк JSON з PHP


587

Я будую 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 , якup_json_encode($data, JSON_PRETTY_PRINT);
марио

6
використання заголовка ('Content-Type: application / json'); робить браузер досить друкованим
partho

4
Станом на липень 2018 року, лише надсилаючи Content-Type: application/jsonзаголовок Firefox, покаже результат, використовуючи власний внутрішній аналізатор JSON, а Chrome - звичайний текст. +1 Firefox!
andreszs

Відповіді:


1126

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);

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>";
Salman Mohammad

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



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 ... заголовка ("Content-Type: application / json");
DeyaEldeen

2
@DeyaEldeen Якщо ви не використовуєте цей заголовок, PHP скаже браузеру, що він надсилає HTML, тож вам доведеться переглянути джерело сторінки, щоб побачити відформатований рядок JSON. Я припускав, що це було зрозуміло, але я думаю, що ні. Я додав це до своєї відповіді.
Майк

І будь-хто, хто записує / переглядає журнал / файл у оболонці unix / linux, це рішення тут! Гарний погляд, @Mike, робить його легким для читання !.
fusion27

@ fusion27 Я не дуже впевнений, на які файли журналів ви посилаєтесь. Я ніколи не чув про жодну програму, яка щось записує в JSON.
Майк

@Mike, це швидкий n-брудний PHP, який я скочував, додаючи тіло запиту (це серіалізована рядок JSON), розміщений на моєму PHP у текстовому файлі, а потім забиваю його в оболонці Unix, щоб я міг дивитись POST. Я використовую ваш трюк, щоб відформатувати цей JSON, зробивши текстовий файл набагато зручнішим.
fusion27

24

Склеювання декількох відповідей разом відповідає моїй потребі в існуючому 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
}

3
Ось трохи функції обгортки для цього:function json_print($json) { return '<pre>' . json_encode(json_decode($json), JSON_PRETTY_PRINT) . '</pre>'; }
Danny Beckett

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 Код композитора хороший тим, що він вільно оновлює від 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;
}

Ось як це робиться! Власна реалізація запускається лише в тому випадку, якщо рідна мова недоступна. Якщо ви впевнені, що ваш код працюватиме лише в PHP 5.4 або вище, ви можете відпочити на JSON_PRETTY_PRINT
Heroselohim

Це рішення дає мені помилку (помилка розбору: помилка синтаксису, несподівана T_FUNCTION) на функції лінії ($ матч)
ARLabs

Композитор взяв це з daveperrett.com/articles/2008/03/11/format-json-with-php , що є тим же, що і stackoverflow.com/a/6054389/1172545 .
localheinz

10

Якщо ви перебуваєте на Firefox, встановіть JSONovich . Насправді я не знаю PHP-рішення, але це робить трюк для цілей розробки / налагодження.


3
Я думаю, що це правильне рішення, коли розробляється api. Це дає найкраще з обох світів, просту налагодження, оскільки ви можете прочитати все, і ви не змінюєте поведінку задум, включаючи його ефективність.
Даніель

Погоджено, він непогано відформатований із кольорами та також розбірний. Набагато приємніше, ніж можна було сподіватись, досягти трохи PHP
Matthew Lock

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"
}

@Madbreaks, він добре друкує у файлі php, не потрібно писати у json-файл, як у facebook.
dknepa

6

Використовувати <pre>в поєднанні з json_encode()та JSON_PRETTY_PRINTопцією:

<pre>
    <?php
    echo json_encode($dataArray, JSON_PRETTY_PRINT);
    ?>
</pre>

6

Якщо у вас є JSON ( $ugly_json)

echo nl2br(str_replace(' ', '&nbsp;', (json_encode(json_decode($ugly_json), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES))));

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];

це було дуже корисно, хоча в ньому було кілька помилок. Я виправив їх, і тепер це працює як шарм, а функція зовсім не така велика! дякую Аджай
Даніель

просто прокоментувати виправлення, якщо хтось хоче скористатися цим ... додайте перевірку перевірки $ c> 1 у другій та третій, якщо умова, а останнє відлуння загорніть його в is_array ($ s), якщо. Це повинно охоплювати його, і ви не повинні мати жодної помилки зміщення рядків неініціалізованої.
Даніель

5

Ви можете трохи змінити відповідь Кендалл Хопкінс у заяві перемикача, щоб отримати досить чистий зовнішній вигляд і красиво відрізний роздруківку, передавши рядок 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); inline у ​​вашому 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" }

Це дійсно приємно дякую. Одне, що я думаю, щоб додати незначне поліпшення, це використовувати var для: $ 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}";

Вище виходило б на зразок Facebook.

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

Що робити, якщо a_valце масив чи об’єкт?
Zach Rattner

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\""
    }
}

Ура


3

Це рішення робить "дійсно гарним" JSON. Не зовсім те, про що просила ОП, але вона дозволяє краще візуалізувати 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);
}

}


2

Якщо ви використовували лише $json_string = json_encode($data, JSON_PRETTY_PRINT);, ви отримаєте у браузері щось подібне (скориставшись посиланням на Facebook у запитанні :)): введіть тут опис зображення

але якщо ви використовували хромоване розширення типу 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;
    }

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.

Сподіваюся, що хтось допомагає


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


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 року;)
веб-майстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.