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.


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

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

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.


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


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
}

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
}

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

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


10

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


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

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

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

6

Jika Anda memiliki JSON ( $ugly_json)

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

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

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

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

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


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

}


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


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

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

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


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


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;

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.