首页 文章

用PHP打印JSON

提问于
浏览
463

我正在构建一个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想出来了 .

22 回答

  • -3

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

    这个函数将采用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;
    }
    
  • 10

    很多用户建议你使用

    echo json_encode($results, JSON_PRETTY_PRINT);
    

    哪个是绝对正确的 . 但这还不够,浏览器需要了解数据类型,您可以在将数据回送给用户之前指定 Headers .

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

    这将导致格式良好的输出 .

    或者,如果您喜欢扩展,则可以使用JSONView for Chrome .

  • 3

    我遇到过同样的问题 .

    无论如何我只是在这里使用了json格式代码:

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

    适合我需要的东西 .

    更维护的版本:https://github.com/GerHobbelt/nicejson-php

  • 3

    我意识到这个问题是关于如何将关联数组编码为漂亮格式的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
    }
    
  • 40

    如果你在firefox上安装JSONovich . 我并不是真正的PHP解决方案,但它可以用于开发目的/调试 .

  • 4

    我从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;
    }
    
  • 53

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

    <pre>json_encode()JSON_PRETTY_PRINT 选项结合使用:

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

    如果您有现有的JSON( $ugly_json

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

    1 - json_encode($rows,JSON_PRETTY_PRINT); 返回带有换行符的美化数据 . 这对命令行输入很有帮助,但是当你在浏览器中看起来很漂亮时 . 浏览器将接受新行作为源(因此,查看页面源确实会显示漂亮的JSON),但它们不用于在浏览器中格式化输出 . 浏览器需要HTML .

    2 - 使用此功能github

    <?php
        /**
         * Formats a JSON string for pretty printing
         *
         * @param string $json The JSON to make pretty
         * @param bool $html Insert nonbreaking spaces and 
    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 = "
    "; } 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; }
  • 10

    您可以在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的前三个开关盒中用 $char="<br>"; 替换 $char.="<br>"; 来轻松摆脱它们 . 以下是您为卡尔加里市进行Google Map 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" }
    
  • -3

    有颜色全输出:微小的解决方案

    码:

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

    你可以像下面这样做 .

    $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"
    }
    
  • 5

    递归解决方案的经典案例 . 这是我的:

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

    干杯

  • 6

    如果你只使用 $json_string = json_encode($data, JSON_PRETTY_PRINT); ,你会在浏览器中得到这样的东西(使用问题中的Facebook link :)):
    enter image description here

    but 如果您使用了像JSONView这样的Chrome扩展(即使没有上面的PHP选项),那么您还可以获得更多 pretty readable debuggable solution ,您甚至可以轻松地折叠/折叠每个JSON对象:
    enter image description here

  • 918

    print_r非常适合PHP打印

    Example 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);
        }
    }
    
  • 6

    这个解决方案让'真的很漂亮'的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);
    }
    

    }

  • 1

    将几个答案粘在一起符合我的需要 existing json:

    echo "<pre>"; 
    echo json_encode(json_decode($json_response), JSON_PRETTY_PRINT); 
    echo "</pre>";
    
    {
        "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
    }
    
  • 6

    以下是对我有用的:

    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”标记 .

    希望能帮助别人

  • 16

    如果您正在使用 MVC

    尝试在你的控制器中这样做

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

    那么如果你调用/ getLatestUsers,你将得到一个漂亮的JSON输出;)

  • 2

    我没有足够的声誉回复肯德尔霍普金斯,但我发现他的美化师有一个错误(它也出现了尴尬)

    这条线应该修改:

    if( $char === '"' && $prev_char != '\\' ) {
    

    if( $char === '"' && ($prev_char != '\\' && $prev_prev_char != '\\' ) {
    

    当一个字符串以反斜杠结尾时,解码器会中断并产生无效的json:

    "kittens\\"
    

相关问题