Pretty-Printing JSON dengan PHP

588

Saya sedang membangun skrip PHP yang mengumpankan data JSON ke skrip lain. Script saya membuat data menjadi array asosiatif besar, dan kemudian mengeluarkan data menggunakan json_encode. Berikut ini contoh skrip:

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

Kode di atas menghasilkan output berikut:

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

Ini bagus jika Anda memiliki sedikit data, tetapi saya lebih suka sesuatu di sepanjang baris ini:

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

Apakah ada cara untuk melakukan ini dalam PHP tanpa hack jelek? Sepertinya seseorang di Facebook menemukan jawabannya.

Zach Rattner
sumber
26
Untuk PHP sebelum 5.4, Anda dapat menggunakan fallback di upgradephp asup_json_encode($data, JSON_PRETTY_PRINT);
mario
6
penggunaan header ('Content-Type: application / json'); membuat browser cukup cetak
partho
4
Pada Juy 2018, hanya dengan mengirimkan Content-Type: application/jsontajuk, Firefox akan menunjukkan hasilnya menggunakan pengurai JSON internal sendiri, sementara Chrome menampilkan teks biasa. +1 Firefox!
andreszs

Jawaban:

1127

PHP 5.4 menawarkan JSON_PRETTY_PRINTopsi untuk digunakan dengan json_encode()panggilan.

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

<?php
...
$json_string = json_encode($data, JSON_PRETTY_PRINT);
ekillaby
sumber
33
Terima kasih, ini adalah cara terbaik untuk melakukannya sekarang. Saya tidak memiliki php 5.4 kembali ketika saya mengajukan pertanyaan ini ...
Zach Rattner
9
5.5.3 di sini, sepertinya menambahkan sedikit jarak antar karakter, bukan indentasi yang sebenarnya.
35
JSON seharusnya tidak mengandung jeda baris HTML, sedangkan karakter baris baru valid di JSON. Jika Anda ingin menampilkan JSON pada halaman web maka lakukan penggantian string pada karakter baris baru atau taruh JSON di elemen <pre> ... </pre>. Lihat json.org untuk referensi sintaksis.
ekillaby
13
Jangan lupa untuk respon set Content-Typeuntuk application/jsonjika Anda ingin browser untuk menampilkan cukup dicetak JSON baik.
Pijusn
6
@countfloortiles itu tidak akan berfungsi secara langsung Anda harus menyertakan output Anda dalam <pre>tag seperti<?php ... $json_string = json_encode($data, JSON_PRETTY_PRINT); echo "<pre>".$json_string."<pre>";
Salman Mohammad
187

Fungsi ini akan mengambil string JSON dan membuat indentasinya sangat mudah dibaca. Itu juga harus konvergen,

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

Memasukkan

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

Keluaran

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

Kode

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;
}
Kendall Hopkins
sumber
84

Banyak pengguna menyarankan agar Anda menggunakan

echo json_encode($results, JSON_PRETTY_PRINT);

Itu benar sekali. Tapi itu tidak cukup, browser perlu memahami jenis data, Anda dapat menentukan header sebelum menggemakan data kembali ke pengguna.

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

Ini akan menghasilkan output yang diformat dengan baik.

Atau, jika Anda suka ekstensi, Anda bisa menggunakan JSONView untuk Chrome.

Wahib Zakraoui
sumber
3
Hanya atur header dan Firefox akan menunjukkannya dengan sempurna menggunakan parser debugging JSON internal sendiri, tidak perlu menyentuh konten JSON sama sekali! Terima kasih!!
andreszs
1
bekerja di chrome juga. Terima kasih.
Don Dilanga
41

Saya memiliki masalah yang sama.

Lagi pula saya hanya menggunakan kode format json di sini:

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

Bekerja dengan baik untuk apa yang saya butuhkan.

Dan versi yang lebih terpelihara: https://github.com/GerHobbelt/nicejson-php

Jason
sumber
Saya mencoba github.com/GerHobbelt/nicejson-php dan bekerja dengan baik di PHP 5.3.
Kontrak Prof. Falken dilanggar
1
Jika Anda menggunakan PHP7.0 (dan lebih tinggi) dan masih perlu mencetak JSON dengan lekukan khusus, localheinz.com/blog/2018/01/04/… seharusnya membantu.
localheinz
40

Saya menyadari pertanyaan ini menanyakan tentang bagaimana menyandikan array asosiatif ke string JSON yang diformat cantik, jadi ini tidak langsung menjawab pertanyaan, tetapi jika Anda memiliki string yang sudah dalam format JSON, Anda dapat membuatnya cukup sederhana dengan mendekode dan meng-encode ulang (membutuhkan PHP> = 5.4):

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

Contoh:

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;

Output ini:

{
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4,
    "e": 5
}
Mike
sumber
terima kasih, ini hanya berfungsi jika saya menambahkan ini di bagian atas php block ... header ('Content-Type: application / json');
DeyaEldeen
2
@DeyaEldeen Jika Anda tidak menggunakan header itu, PHP akan memberi tahu browser bahwa itu mengirim HTML, jadi Anda harus melihat sumber halaman untuk melihat string JSON yang diformat. Saya berasumsi bahwa itu dipahami, tetapi saya rasa tidak. Saya telah menambahkannya ke jawaban saya.
Mike
Dan siapa pun tailing / meninjau log / file di shell unix / linux, ini solusinya di sini! Tampan, @Mike, membuatnya mudah dibaca !.
fusion27
@ fusion27 Saya tidak begitu yakin file log apa yang Anda maksud. Saya tidak pernah mendengar ada program yang mencatat apa pun di JSON.
Mike
@Mike, ini adalah PHP cepat-n-kotor. Saya menyiapkan menambahkan tubuh permintaan (yang merupakan string JSON berseri) dikirim ke PHP saya ke textfile, saya kemudian memasukkannya ke dalam shell unix sehingga saya bisa menonton POST langsung. Saya menggunakan trik Anda untuk memformat JSON yang membuat file teks jauh lebih bermanfaat.
fusion27
25

Merekatkan beberapa jawaban sesuai dengan kebutuhan saya untuk json yang ada:

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

Output:
{
    "data": {
        "token_type": "bearer",
        "expires_in": 3628799,
        "scopes": "full_access",
        "created_at": 1540504324
    },
    "errors": [],
    "pagination": {},
    "token_type": "bearer",
    "expires_in": 3628799,
    "scopes": "full_access",
    "created_at": 1540504324
}
Kevin
sumber
3
Berikut ini adalah fungsi pembungkus kecil untuk melakukan ini:function json_print($json) { return '<pre>' . json_encode(json_decode($json), JSON_PRETTY_PRINT) . '</pre>'; }
Danny Beckett
11

Saya mengambil kode dari Komposer: https://github.com/composer/composer/blob/master/src/Composer/Json/JsonFile.php dan nicejson: https://github.com/GerHobbelt/nicejson-php/blob /master/nicejson.php Kode komposer baik karena pembaruan lancar dari 5,3 ke 5,4 tetapi hanya mengkodekan objek sedangkan nicejson mengambil string json, jadi saya menggabungkannya. Kode dapat digunakan untuk memformat string json dan / atau menyandikan objek, saya saat ini menggunakannya dalam modul Drupal.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        $result .= $char;

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

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

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

    return $result;
}
ulk200
sumber
Beginilah caranya! Implementasi sendiri hanya berjalan jika asli tidak tersedia. Jika Anda yakin kode Anda hanya akan berjalan dalam PHP 5.4 atau lebih tinggi, Anda dapat mengandalkan JSON_PRETTY_PRINT
Heroselohim
Solusi ini memberi saya kesalahan (Parse error: kesalahan sintaksis, T_FUNCTION tak terduga) pada fungsi baris ($ match)
ARLabs
Komposer mengambilnya dari daveperrett.com/articles/2008/03/11/format-json-with-php , yang sama dengan stackoverflow.com/a/6054389/1172545 .
localheinz
10

Jika Anda menggunakan firefox, instal JSONovich . Tidak benar-benar solusi PHP yang saya tahu, tetapi ia melakukan trik untuk tujuan pengembangan / debugging.

Jay Sidri
sumber
3
Saya pikir ini adalah solusi yang tepat ketika menggunakan api. Ini memberikan yang terbaik dari kedua dunia, debugging mudah karena Anda dapat membaca semuanya dan Anda tidak mengubah perilaku backends, termasuk kinerjanya.
Daniel
Setuju, itu diformat dengan baik dengan warna dan dilipat juga. Jauh lebih baik daripada yang bisa Anda harapkan untuk dicapai dengan sedikit PHP
Matthew Lock
10

Saya telah menggunakan ini:

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

Atau gunakan tajuk php seperti di bawah ini:

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

Cara sederhana untuk php> 5.4: seperti di grafik Facebook

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

Hasil dalam browser

{
    "a": "apple",
    "b": "banana",
    "c": "catnip"
}
dknepa
sumber
@Madbreaks, ini dicetak dengan baik dalam file php, tidak perlu menulis dalam file json, sama seperti facebook.
dknepa
6

Gunakan <pre>dalam kombinasi dengan json_encode()dan JSON_PRETTY_PRINTopsi:

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

Jika Anda memiliki JSON ( $ugly_json)

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

Memiliki keluaran penuh warna: Tiny Solution

Kode:

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

$crl = 0;
$ss = false;
echo "<pre>";
for($c=0; $c<strlen($s); $c++)
{
    if ( $s[$c] == '}' || $s[$c] == ']' )
    {
        $crl--;
        echo "\n";
        echo str_repeat(' ', ($crl*2));
    }
    if ( $s[$c] == '"' && ($s[$c-1] == ',' || $s[$c-2] == ',') )
    {
        echo "\n";
        echo str_repeat(' ', ($crl*2));
    }
    if ( $s[$c] == '"' && !$ss )
    {
        if ( $s[$c-1] == ':' || $s[$c-2] == ':' )
            echo '<span style="color:#0000ff;">';
        else
            echo '<span style="color:#ff0000;">';
    }
    echo $s[$c];
    if ( $s[$c] == '"' && $ss )
        echo '</span>';
    if ( $s[$c] == '"' )
          $ss = !$ss;
    if ( $s[$c] == '{' || $s[$c] == '[' )
    {
        $crl++;
        echo "\n";
        echo str_repeat(' ', ($crl*2));
    }
}
echo $s[$c];
J Ajay
sumber
ini sangat membantu, meskipun ada beberapa kesalahan di dalamnya. Saya memperbaikinya dan sekarang berfungsi seperti mantra, dan fungsinya tidak sebesar itu sama sekali! terima kasih Ajay
Daniel
hanya untuk mengomentari perbaikan jika ada yang ingin menggunakan ini ... tambahkan cek validasi $ c> 1 dalam kondisi kedua dan ketiga, dan gema terakhir bungkus menjadi is_array ($ s) jika. yang harus menutupinya dan Anda seharusnya tidak mendapatkan kesalahan offset string Uninitialized.
Daniel
5

Anda dapat mengubah sedikit jawaban Kendall Hopkins dalam pernyataan switch untuk mendapatkan hasil cetakan yang cukup bersih dan lekukan dengan mengirimkan string json ke dalam yang berikut:

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;

}

Sekarang jalankan saja fungsi prettyPrint ($ your_json_string); sebaris di php Anda dan nikmati cetakannya. Jika Anda seorang minimalis dan tidak suka tanda kurung karena beberapa alasan, Anda dapat menyingkirkannya dengan mudah dengan mengganti $char.="<br>";dengan $char="<br>";dalam tiga kotak saklar teratas dengan $ char. Inilah yang Anda dapatkan dari panggilan Google maps API untuk kota 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" }
Cupcake
sumber
Ini sangat bagus, terima kasih. Satu hal yang saya pikir untuk menambahkan sedikit peningkatan adalah menggunakan var untuk: $ indent = "-----", lalu gunakan itu (bukan "-----" di tempat yang berbeda dalam kode)
gvanto
3

Anda bisa melakukannya seperti di bawah ini.

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

Di atas akan menampilkan semacam Facebook.

{
"a" : "apple",
"b" : "banana",
"c" : "catnip"
}
Jake
sumber
Bagaimana jika a_valarray atau objek?
Zach Rattner
1
Saya menjawab contoh menggunakan Json dalam pertanyaan, saya akan segera memperbarui jawaban saya.
Jake
3

Kasing klasik untuk solusi rekursif. Ini milik saya:

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

Pemakaian:

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

Bersulang

Pecah-pecah
sumber
3

Solusi ini membuat JSON 'sangat cantik'. Tidak persis apa yang diminta OP, tetapi memungkinkan Anda memvisualisasikan JSON dengan lebih baik.

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

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

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

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

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

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

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

}

pgee70
sumber
2

Jika Anda hanya menggunakan $json_string = json_encode($data, JSON_PRETTY_PRINT);, Anda akan masuk ke browser seperti ini (menggunakan tautan Facebook dari pertanyaan :)): masukkan deskripsi gambar di sini

tetapi jika Anda menggunakan Ekstensi chrome seperti JSONView (bahkan tanpa opsi PHP di atas), maka Anda mendapatkan solusi debuggable yang lebih mudah dibaca di mana Anda bahkan dapat Lipat / Perkecil setiap objek JSON dengan mudah seperti ini: masukkan deskripsi gambar di sini

AbdelHady
sumber
1

print_r print cantik untuk PHP

Contoh 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);
    }
}
Shelly Chen
sumber
1

1 - json_encode($rows,JSON_PRETTY_PRINT);mengembalikan data yang telah dicetak sebelumnya dengan karakter baris baru. Ini membantu untuk input baris perintah, tetapi karena Anda telah menemukan tidak terlihat cantik di dalam browser. Browser akan menerima baris baru sebagai sumber (dan karenanya, melihat sumber halaman memang akan menampilkan JSON yang cantik), tetapi mereka tidak digunakan untuk memformat output di browser. Browser membutuhkan HTML.

2 - gunakan github fungsi ini

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

Berikut ini yang berhasil bagi saya:

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

keluaran:

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
)

Perhatikan juga penggunaan tag "pre" di html.

Semoga itu bisa membantu seseorang

tulang T
sumber
2
Ini tidak menjawab pertanyaan. Anda membuang vars, bukan mencetak JSON yang diformat.
Madbreaks
0

Cara terbaik untuk memformat data JSON adalah seperti ini!

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

Ganti $ response dengan Data Anda yang harus dikonversi ke JSON

Resad Indipa
sumber
0

Bagi yang menjalankan PHP versi 5.3 atau sebelumnya, Anda dapat mencoba di bawah ini:

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

echo $pretty_json;
Keith Chiah
sumber
-4

Jika Anda bekerja dengan MVC

coba lakukan ini di controller Anda

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

maka jika Anda memanggil / getLatestUsers Anda akan mendapatkan hasil JSON yang cantik;)

webmaster
sumber
lihat komentar saya setelah gema di mana itu cukup printend
webmaster
1
MVC adalah jenis desain kerangka kerja, tidak ada hubungannya dengan keluaran JSON.
Maciej Paprocki
ini merupakan jawaban dari 2013 orang;)
webmaster