PHP로 예쁘게 인쇄하는 JSON


587

JSON 데이터를 다른 스크립트에 공급하는 PHP 스크립트를 작성 중입니다. 내 스크립트는 데이터를 큰 연관 배열로 빌드 한 다음을 사용하여 데이터를 출력합니다 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에서 이것을 수행하는 방법이 있습니까? 페이스 북의 누군가가 알아 낸 것 같습니다 .


26
5.4 이전 PHP의 경우 upgradephp 에서 다음 과 같이 폴백을 사용할 수 있습니다.up_json_encode($data, JSON_PRETTY_PRINT);
mario

6
헤더 사용 ( 'Content-Type : application / json'); 브라우저를 예쁘게 인쇄합니다
partho

4
Juy 2018 Content-Type: application/json부터는 헤더 를 보내면 Firefox가 자체 내부 JSON 파서를 사용하여 결과를 표시하지만 Chrome은 일반 텍스트를 표시합니다. Firefox +1!
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를 다시 얻지 못했습니다 ...
Zach Rattner

9
5.5.3 여기서, 실제 들여 쓰기가 아닌 문자 사이에 약간의 간격을 추가하는 것 같습니다.

35
JSON에는 줄 바꿈 문자가 JSON에서 유효하지만 JSON에는 HTML 줄 바꿈이 포함되어 있지 않습니다. 웹 페이지에 JSON을 표시하려면 개행 문자를 직접 문자열로 바꾸거나 <pre> ... </ pre> 요소에 JSON을 넣으십시오. 구문 참조는 json.org 를 참조하십시오 .
ekillaby

13
세트 응답 잊지 마세요 Content-Typeapplication/json당신이 브라우저가 잘 꽤 인쇄 JSON을 표시하려는 경우.
Pijusn

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 for Chrome을 사용할 수 있습니다.


3
헤더 만 설정하면 Firefox는 자체 내부 JSON 디버깅 파서를 사용하여 완벽하게 표시하므로 JSON 내용을 전혀 만질 필요가 없습니다! 감사합니다!!
andreszs

1
크롬에서도 작동합니다. 감사.
Don Dilanga

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에서 훌륭하게 작동합니다.
Falken 교수 계약

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 문자열을 보려면 페이지 소스를 봐야합니다. 나는 그것이 이해되었다고 가정했지만, 그렇지 않다고 생각합니다. 나는 그것을 내 대답에 추가했다.
Mike

그리고 유닉스 / 리눅스 쉘에서 로그 / 파일을 테일링 / 검토하는 사람이라면, 이것이 해결책입니다! @Mike를 잘 살펴보면 쉽게 읽을 수 있습니다!.
fusion27

@ fusion27 어떤 로그 파일을 참조하는지 잘 모르겠습니다. JSON에 아무것도 기록하는 프로그램에 대해 들어 본 적이 없습니다.
Mike

@Mike, 그것은 PHP에 텍스트 파일에 POST 된 요청 본문 (직렬화 된 JSON 문자열)을 추가하는 것을 끝내는 빠른 n-dirty 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

내가 작곡가의 코드를했다 : 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

이 솔루션은 라인 함수 ($ match)에서 오류 (구문 오류 : 구문 오류, 예기치 않은 T_FUNCTION)를 제공합니다.
ARLabs


10

파이어 폭스에 있다면 JSONovich를 설치하십시오 . 내가 아는 PHP 솔루션은 아니지만 개발 목적 / 디버깅을위한 트릭을 수행합니다.


3
나는 이것이 API를 개발할 때 적절한 해결책이라고 생각합니다. 모든 것을 읽을 수 있고 성능을 포함하여 백엔드 동작을 변경하지 않기 때문에 두 가지 이점을 모두 제공하며 쉽게 디버깅 할 수 있습니다.
Daniel

동의, 그것은 색상으로 멋지게 형식화되고 접을 수 있습니다. 약간의 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 파일로 쓸 필요가 없습니다.
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

풀 컬러 출력 : 작은 솔루션

암호:

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

약간의 오류가 있어도 도움이되었습니다. 나는 그들을 고쳤고 이제는 매력처럼 작동하며 기능은 그다지 크지 않습니다! 감사합니다 Ajay
Daniel

누군가 이것을 사용하려면 수정 사항에 대해 의견을 말하십시오. 두 번째 및 세 번째 if 조건에서 유효성 검사 확인 $ c> 1을 추가하고 마지막 에코는 is_array ($ s)로 래핑합니다. 그 내용을 다루어야하며 초기화되지 않은 문자열 오프셋 오류가 발생하지 않아야합니다.
Daniel

5

switch 문에서 Kendall Hopkins의 답변을 약간 수정하여 다음에 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>";$ 문자의 세 가지 스위치의 경우. 다음은 캘거리 도시에 대한 Google Maps API 호출에 대한 정보입니다.

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 = "-----"에 var을 사용하는 것입니다 (코드의 다른 위치에서 "-----"대신)
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 21시 47 분

1
질문에 Json을 사용하여 예제에 응답하면 곧 답변을 업데이트 할 것입니다.
Jake

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을 만듭니다. 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);
}

}


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이 필요합니다.

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

또한 html에서 "pre"태그를 사용하십시오.

누군가를 돕는 희망


2
이것은 질문에 대답하지 않습니다. 형식이 지정된 JSON을 인쇄하지 않고 vars를 덤프합니다.
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 출력과 아무 관련이 없습니다.
Maciej Paprocki

2013 사람들의 답변;)
웹 마스터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.