JSON đẹp bằng in PHP


588

Tôi đang xây dựng một tập lệnh PHP cung cấp dữ liệu JSON cho một tập lệnh khác. Kịch bản của tôi xây dựng dữ liệu thành một mảng kết hợp lớn, và sau đó xuất dữ liệu bằng cách sử dụng json_encode. Đây là một kịch bản ví dụ:

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

Đoạn mã trên mang lại đầu ra sau:

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

Điều này thật tuyệt nếu bạn có một lượng dữ liệu nhỏ, nhưng tôi thích thứ gì đó dọc theo những dòng này:

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

Có cách nào để làm điều này trong PHP mà không cần một hack xấu xí không? Có vẻ như ai đó ở Facebook đã tìm ra nó.


26
Đối với PHP trước 5.4, bạn có thể sử dụng dự phòng trong upgradephp nhưup_json_encode($data, JSON_PRETTY_PRINT);
Mario

6
sử dụng tiêu đề ('Loại nội dung: ứng dụng / json'); làm cho trình duyệt được in đẹp
partho 23/03/18

4
Kể từ Juy 2018, chỉ bằng cách gửi Content-Type: application/jsontiêu đề Firefox sẽ hiển thị kết quả bằng trình phân tích cú pháp JSON bên trong của chính nó, trong khi Chrome hiển thị văn bản thuần túy. 1 Firefox!
andreszs

Câu trả lời:


1127

PHP 5.4 cung cấp JSON_PRETTY_PRINTtùy chọn để sử dụng với json_encode()cuộc gọi.

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

<?php
...
$json_string = json_encode($data, JSON_PRETTY_PRINT);

33
Cảm ơn, đây là cách tốt nhất để làm điều đó bây giờ. Tôi đã không có php 5.4 trở lại khi tôi hỏi câu hỏi này ...
Zach Rattner

9
5.5.3 ở đây, dường như chỉ thêm một chút khoảng cách giữa các ký tự, không phải bất kỳ thụt lề thực tế nào.

35
JSON không được phép chứa các ngắt dòng HTML, trong khi các ký tự dòng mới là hợp lệ trong JSON. Nếu bạn muốn hiển thị JSON trên một trang web thì hãy tự thay thế chuỗi trên các ký tự dòng mới hoặc nếu không hãy đặt JSON trong phần tử <pre> ... </ pre>. Xem json.org để tham khảo cú pháp.
ekillaby

13
Đừng quên để thiết lập phản ứng Content-Typeđể application/jsonnếu bạn muốn trình duyệt để hiển thị khá-in JSON độc đáo.
Pijusn

6
@countfloortiles nó sẽ không hoạt động trực tiếp, bạn cần đưa đầu ra của mình vào <pre>thẻ như<?php ... $json_string = json_encode($data, JSON_PRETTY_PRINT); echo "<pre>".$json_string."<pre>";
Salman Mohammad

187

Hàm này sẽ lấy chuỗi JSON và thụt lề rất dễ đọc. Nó cũng nên được hội tụ,

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

Đầu vào

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

Đầu ra

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

Nhiều người dùng đề nghị bạn sử dụng

echo json_encode($results, JSON_PRETTY_PRINT);

Điều này là hoàn toàn đúng. Nhưng nó không đủ, trình duyệt cần phải hiểu loại dữ liệu, bạn có thể chỉ định tiêu đề ngay trước khi dội lại dữ liệu cho người dùng.

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

Điều này sẽ dẫn đến một đầu ra được định dạng tốt.

Hoặc, nếu bạn thích tiện ích mở rộng, bạn có thể sử dụng JSONView cho Chrome.


3
Chỉ đặt tiêu đề và Firefox sẽ hiển thị hoàn hảo bằng trình phân tích gỡ lỗi JSON nội bộ của riêng nó, không cần phải chạm vào nội dung JSON! Cảm ơn bạn!!
andreszs

1
hoạt động trong chrome quá. cảm ơn.
Don Dilanga

41

Tôi gặp vấn đề tương tự.

Dù sao tôi chỉ sử dụng mã định dạng json ở đây:

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

Hoạt động tốt cho những gì tôi cần nó cho.

Và một phiên bản được duy trì nhiều hơn: https://github.com/GerHobbelt/nicejson-php


Tôi đã thử github.com/GerHobbelt/nicejson-php và nó hoạt động rất tốt trong PHP 5.3.
Hợp đồng của giáo sư Falken vi phạm

1
Nếu bạn đang dùng PHP7.0 (trở lên) và vẫn cần in JSON đẹp với thụt lề tùy chỉnh, localheinz.com/blog/2018/01/04/ nên sử dụng.
localheinz

40

Tôi nhận ra câu hỏi này là hỏi về cách mã hóa một mảng kết hợp thành một chuỗi JSON có định dạng đẹp, vì vậy điều này không trả lời trực tiếp câu hỏi, nhưng nếu bạn có một chuỗi đã ở định dạng JSON, bạn có thể làm cho nó khá đơn giản bằng cách giải mã và mã hóa lại nó (yêu cầu PHP> = 5.4):

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

Thí dụ:

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;

Kết quả này:

{
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4,
    "e": 5
}

cảm ơn, nó chỉ hoạt động nếu tôi thêm phần này ở đầu khối php ... tiêu đề ('Loại nội dung: application / json');
DeyaEldeen

2
@DeyaEldeen Nếu bạn không sử dụng tiêu đề đó, PHP sẽ thông báo cho trình duyệt rằng nó đang gửi HTML, vì vậy bạn sẽ phải xem nguồn trang để xem chuỗi JSON được định dạng. Tôi cho rằng đã được hiểu, nhưng tôi đoán là không. Tôi đã thêm nó vào câu trả lời của tôi.
Mike

Và bất cứ ai theo đuôi / xem xét một bản ghi / tệp trong shell unix / linux, đây là giải pháp ở đây! Nhìn tốt, @Mike, giúp bạn dễ đọc!.
nhất27

@ fusion27 Tôi không thực sự chắc chắn về tệp nhật ký nào bạn đang đề cập đến. Tôi chưa bao giờ nghe thấy bất kỳ chương trình nào ghi nhật ký bất cứ điều gì trong JSON.
Mike

@Mike, đó là một PHP nhanh chóng, tôi đã nhanh chóng nối thêm phần thân yêu cầu (là một chuỗi JSON được xê-ri hóa) được gửi lên PHP của tôi vào một tệp văn bản, sau đó tôi đặt nó trong trình bao unix để tôi có thể xem POST trực tiếp. Tôi đang sử dụng thủ thuật của bạn để định dạng JSON làm cho tệp văn bản có thể sử dụng được nhiều hơn.
nhất27

25

Kết hợp nhiều câu trả lời phù hợp với nhu cầu của tôi đối với json hiện có:

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
Đây là một chức năng bao bọc nhỏ để làm điều này:function json_print($json) { return '<pre>' . json_encode(json_decode($json), JSON_PRETTY_PRINT) . '</pre>'; }
Danny Beckett

11

Tôi đã lấy mã từ Trình soạn thảo: https://github.com/composer/composer/blob/master/src/Composer/Json/JsonFile.php và Nicejson: https://github.com/GerHobbelt/nicejson-php/blob /master/nicejson.php Mã trình soạn thảo là tốt vì nó cập nhật trôi chảy từ 5,3 đến 5,4 nhưng nó chỉ mã hóa đối tượng trong khi Nicejson lấy chuỗi json, vì vậy tôi đã hợp nhất chúng. Mã này có thể được sử dụng để định dạng chuỗi json và / hoặc mã hóa các đối tượng, tôi hiện đang sử dụng nó trong mô-đun 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;
}

Đây là cách mà nó được hoàn thành! Việc thực hiện riêng chỉ chạy nếu bản địa không có sẵn. Nếu bạn chắc chắn mã của bạn sẽ chỉ chạy trong PHP 5.4 trở lên, bạn có thể nghỉ ngơi trên JSON_PRETTY_PRINT
Heroselohim

Giải pháp này mang lại cho tôi lỗi (Lỗi phân tích cú pháp: lỗi cú pháp, T_FUNCTION không mong muốn) trên chức năng dòng ($ khớp)
ARLabs


10

Nếu bạn đang dùng firefox, hãy cài đặt JSONovich . Tôi thực sự không phải là một giải pháp PHP, nhưng nó thực hiện thủ thuật cho mục đích phát triển / gỡ lỗi.


3
Tôi nghĩ rằng đây là giải pháp thích hợp khi phát triển api. Nó cung cấp tốt nhất cho cả hai thế giới, dễ dàng gỡ lỗi vì bạn có thể đọc mọi thứ và bạn không thay đổi hành vi phụ trợ, bao gồm cả hiệu suất của nó.
Daniel

Đồng ý, nó được định dạng độc đáo với màu sắc và có thể thu gọn. Đẹp hơn nhiều so với bạn có thể hy vọng đạt được với một chút PHP
Matthew Lock

10

Tôi đã sử dụng điều này:

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

Hoặc sử dụng các tiêu đề php như dưới đây:

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

8

Cách đơn giản cho php> 5.4: like trong biểu đồ Facebook

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

Kết quả trong trình duyệt

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

@Madbreaks, nó in tốt trong tệp php, không cần phải viết trong tệp json, giống như facebook.
dknepa

6

Sử dụng <pre>kết hợp với json_encode()JSON_PRETTY_PRINTtùy chọn:

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

6

Nếu bạn có JSON ( $ugly_json)

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

5

Có màu đầu ra đầy đủ: Giải pháp nhỏ

Mã số:

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

Điều này rất hữu ích, mặc dù nó có một vài lỗi trong đó. Tôi đã sửa chúng và bây giờ nó hoạt động như một bùa mê, và chức năng không lớn lắm đâu! cảm ơn Ajay
Daniel

chỉ cần nhận xét về các bản sửa lỗi nếu có ai muốn sử dụng ... thêm kiểm tra xác thực $ c> 1 trong điều kiện thứ hai và thứ ba nếu điều kiện và tiếng vang cuối cùng bao bọc nó thành is_array ($ s) nếu. điều đó sẽ che nó và bạn không nên nhận bất kỳ lỗi bù chuỗi Uninitialized nào.
Daniel

5

Bạn có thể sửa đổi câu trả lời của Kendall Hopkins một chút trong câu lệnh chuyển đổi để có được một bản in trông khá sạch sẽ và độc đáo bằng cách chuyển một chuỗi json vào sau:

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;

}

Bây giờ chỉ cần chạy hàm beautifulPrint ($ your_json_opes); nội tuyến trong php của bạn và tận hưởng bản in. Nếu bạn là người tối giản và không thích dấu ngoặc vì một số lý do, bạn có thể loại bỏ chúng dễ dàng bằng cách thay thế $char.="<br>";bằng $char="<br>";ba trường hợp chuyển đổi hàng đầu trên $ char. Đây là những gì bạn nhận được cho một cuộc gọi API bản đồ google cho thành phố Calgary

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

Điều này thực sự tốt đẹp cảm ơn. Một điều tôi nghĩ để thêm cải thiện nhỏ là sử dụng var cho: $ indent = "-----", sau đó sử dụng (thay vì "-----" ở các vị trí khác nhau trong mã)
gvanto

3

Bạn có thể làm như dưới đây.

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

Ở trên sẽ xuất ra loại như Facebook.

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

Điều gì nếu a_vallà một mảng hoặc một đối tượng?
Zach Rattner

1
Tôi đã trả lời một ví dụ bằng cách sử dụng Json trong câu hỏi, tôi sẽ cập nhật câu trả lời của tôi sớm.
Jake

3

Trường hợp cổ điển cho một giải pháp đệ quy. Đây là của tôi:

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

Sử dụng:

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

Chúc mừng


3

Giải pháp này làm cho JSON 'thực sự đẹp'. Không chính xác những gì OP yêu cầu, nhưng nó cho phép bạn hình dung JSON tốt hơn.

/**
 * 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

Nếu bạn chỉ sử dụng $json_string = json_encode($data, JSON_PRETTY_PRINT);, bạn sẽ nhận được trong trình duyệt một cái gì đó như thế này (sử dụng liên kết Facebook từ câu hỏi :)): nhập mô tả hình ảnh ở đây

nhưng nếu bạn đã sử dụng Tiện ích mở rộng chrome như JSONView (ngay cả khi không có tùy chọn PHP ở trên), thì bạn sẽ có được một giải pháp gỡ lỗi dễ đọc hơn , nơi bạn thậm chí có thể Gấp / Thu gọn từng đối tượng JSON đơn giản như thế này: nhập mô tả hình ảnh ở đây


1

print_r in đẹp cho PHP

Ví dụ 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); trả về dữ liệu đã được chỉnh sửa với các ký tự dòng mới. Điều này hữu ích cho đầu vào dòng lệnh, nhưng như bạn đã phát hiện ra trông không đẹp bằng trình duyệt. Trình duyệt sẽ chấp nhận các dòng mới dưới dạng nguồn (và do đó, xem nguồn trang thực sự sẽ hiển thị JSON đẹp), nhưng chúng không được sử dụng để định dạng đầu ra trong trình duyệt. Trình duyệt yêu cầu HTML.

2 - sử dụng github đấu giá này

<?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

Sau đây là những gì làm việc cho tôi:

Nội dung của 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>

đầu ra:

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
)

Cũng lưu ý việc sử dụng thẻ "pre" trong html.

Mong rằng sẽ giúp được ai đó


2
Điều này không trả lời câu hỏi. Bạn đang bán phá giá, không in JSON được định dạng.
Madbreaks

0

cách tốt nhất để định dạng dữ liệu JSON là như thế này!

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

Thay thế phản hồi $ bằng Dữ liệu của bạn được yêu cầu chuyển đổi thành JSON


0

Đối với những người chạy phiên bản PHP 5.3 trở lên, bạn có thể thử bên dưới:

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

echo $pretty_json;

-4

Nếu bạn đang làm việc với MVC

hãy thử làm điều này trong bộ điều khiển của bạn

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

sau đó nếu bạn gọi / getLatestUsers, bạn sẽ nhận được một đầu ra JSON đẹp;)


xem bình luận của tôi sau tiếng vang nơi nó đang được in đẹp
quản trị trang web

1
MVC là một kiểu thiết kế khung, không liên quan gì đến việc xuất JSON.
Maciej Paprocki

đó là câu trả lời từ người 2013;)
quản trị trang web
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.