PHP ile Güzel Baskı JSON


588

Başka bir komut dosyasına JSON veri besleyen bir PHP komut dosyası yapıyorum. Betiğim, verileri büyük bir ilişkilendirilebilir diziye oluşturur ve ardından verileri kullanarak çıktılar json_encode. İşte bir örnek betik:

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

Yukarıdaki kod aşağıdaki çıktıyı verir:

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

Bu, az miktarda veriye sahipseniz harika, ancak bu satırlarda bir şey tercih ederim:

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

Çirkin bir kesmek olmadan PHP bunu yapmanın bir yolu var mı? Görünüşe göre Facebook'ta birisi bunu çözdü.


26
5.4 öncesi PHP için, içinde yedeği kullanabilirsiniz upgradephp olarakup_json_encode($data, JSON_PRETTY_PRINT);
mario

6
başlık kullanımı ('Content-Type: application / json'); tarayıcı güzel yazdırır
partho

4
Juy 2018'den itibaren, yalnızca Content-Type: application/jsonFirefox üstbilgisini göndererek sonucu kendi dahili JSON ayrıştırıcısını kullanarak gösterecek, Chrome ise düz metni gösterecektir. +1 Firefox!
andreszs

Yanıtlar:


1127

PHP 5.4 çağrı JSON_PRETTY_PRINTile kullanım seçeneği sunar json_encode().

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

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

33
Teşekkürler, şimdi yapmanın en iyi yolu bu. Bu soruyu sorduğumda php 5.4'üm yoktu ...
Zach Rattner

9
5.5.3 burada, karakterler arasında biraz boşluk bırakıyor gibi görünüyor, gerçek girintiler değil.

35
JSON'un HTML satır sonları içermesi gerekmezken, JSON'da yeni satır karakterleri geçerlidir. JSON'u bir web sayfasında görüntülemek istiyorsanız, satırsonu karakterlerine kendiniz bir dize değiştirme yapın veya JSON'u bir <pre> ... </pre> öğesine yerleştirin. Sözdizimi referansı için json.org adresine bakın .
ekillaby

13
Tarayıcının güzel yazdırılmış JSON'u güzel bir şekilde görüntülemesini istiyorsanız yanıt Content-Typevermeyi unutmayın application/json.
Pijusn

6
@countfloortiles Eğer sizin çıkışını içine gerek doğrudan işe yaramaz <pre>gibi etiketi<?php ... $json_string = json_encode($data, JSON_PRETTY_PRINT); echo "<pre>".$json_string."<pre>";
Salman Mohammad

187

Bu işlev JSON dizesini alır ve çok okunabilir girintiler. Ayrıca yakınsak olmalı,

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

Giriş

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

Çıktı

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

kod

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

Birçok kullanıcı,

echo json_encode($results, JSON_PRETTY_PRINT);

Bu kesinlikle doğru. Ancak bu yeterli değildir, tarayıcının veri türünü anlaması gerekir, verileri kullanıcıya geri göndermeden hemen önce başlığı belirtebilirsiniz.

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

Bu, iyi biçimlendirilmiş bir çıktı ile sonuçlanır.

Veya uzantıları beğendiyseniz Chrome için JSONView kullanabilirsiniz.


3
Sadece başlığı ayarlayın ve Firefox kendi dahili JSON hata ayıklama ayrıştırıcısını kullanarak mükemmel bir şekilde gösterecektir, JSON içeriğine dokunmaya gerek yok! Teşekkür ederim!!
andreszs

1
kromda da çalışır. Teşekkürler.
Don Dilanga

41

Aynı sorunu yaşadım.

Neyse ben sadece burada json biçimlendirme kodu kullanılır:

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

İhtiyacım olan şey için iyi çalışıyor.

Ve daha bakımlı bir sürüm: https://github.com/GerHobbelt/nicejson-php


Github.com/GerHobbelt/nicejson-php denedim ve PHP 5.3'te harika çalışıyor.
Prof. Falken sözleşmesi

1
PHP7.0 (ve üstü) kullanıyorsanız ve hala JSON'u özel girintiyle yazdırmanız gerekiyorsa, localheinz.com/blog/2018/01/04/… yardımcı olacaktır.
localheinz

40

Bu sorunun güzel biçimlendirilmiş bir JSON dizesine ilişkilendirilebilir bir dizinin nasıl kodlanacağını sorduğunu anlıyorum, bu yüzden bu doğrudan soruyu cevaplamıyor, ancak zaten JSON biçiminde bir dize varsa, bunu oldukça basit yapabilirsiniz kodunu çözerek ve yeniden kodlayarak (PHP> = 5.4 gerektirir):

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

Misal:

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;

Bu çıktılar:

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

teşekkürler, ben sadece php bloğunun üstüne eklerseniz çalışır ... header ('Content-Type: application / json');
DeyaEldeen

2
@DeyaEldeen Bu başlığı kullanmazsanız, PHP tarayıcıya HTML gönderdiğini söyleyecektir, bu nedenle biçimlendirilmiş JSON dizesini görmek için sayfa kaynağını görüntülemeniz gerekir. Bunun anlaşıldığını varsaydım, ama sanmıyorum. Cevabıma ekledim.
Mike

Ve unix / linux kabuğundaki bir günlük / dosyayı inceleyen / gözden geçiren herkes, buradaki çözüm! İyi bakmak @Mike, okumayı kolaylaştırır !.
fusion27

@ fusion27 Hangi günlük dosyalarına başvurduğunuzdan emin değilim. JSON'da hiçbir şey kaydeden hiçbir program duymadım.
Mike

@Mike, ben bir textfile benim PHP POSTed istek gövdesi (seri hale getirilmiş bir JSON dizesi) ekleyerek çırpılmış bir hızlı n-kirli PHP, sonra canlı POSTs izleyebilirsiniz böylece unix kabuk kuyruk. Metin dosyasını çok daha kullanışlı hale getiren JSON'u biçimlendirmek için hilenizi kullanıyorum.
fusion27

24

Birlikte birkaç cevap yapıştırmak mevcut json ihtiyacım uygun :

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
İşte bunu yapmak için küçük bir sarmalayıcı işlevi:function json_print($json) { return '<pre>' . json_encode(json_decode($json), JSON_PRETTY_PRINT) . '</pre>'; }
Danny Beckett

11

Ben Composer'daki kod aldı: https://github.com/composer/composer/blob/master/src/Composer/Json/JsonFile.php ve nicejson: https://github.com/GerHobbelt/nicejson-php/blob /master/nicejson.php Besteci kodu, 5.3'ten 5.4'e kadar akıcı bir şekilde güncellenmesi nedeniyle iyidir, ancak nicejson json dizelerini alırken yalnızca nesneyi kodlar, bu yüzden onları birleştirdim. Kod json dizesini formatlamak ve / veya nesneleri kodlamak için kullanılabilir, şu anda bir Drupal modülünde kullanıyorum.

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

İşte böyle yapılır! Kendi uygulama yalnızca yerel kullanılamıyorsa çalışır. Kodunuzun yalnızca PHP 5.4 veya üstü sürümlerde çalışacağından eminseniz JSON_PRETTY_PRINT
Heroselohim

Bu çözüm bana hat fonksiyonunda hata (Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_FUNCTION) veriyor ($ match)
ARLabs


10

Firefox'taysanız JSONovich'i yükleyin . Gerçekten bir PHP çözümü biliyorum, ama geliştirme amaçlı / hata ayıklama için hile yapar.


3
Bence bu bir API geliştirirken uygun bir çözüm. Her şeyi okuyabilir ve performansı da dahil olmak üzere arka uçların davranışını değiştirmediğiniz için her iki dünyanın en iyisini, kolay hata ayıklamayı sağlar.
Daniel

Kabul etti, güzel renklerle biçimlendirilmiş ve katlanabilir. Biraz PHP ile başarmayı umduğunuzdan çok daha güzel
Matthew Lock

10

Bunu kullandım:

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

Veya aşağıdaki gibi php başlıklarını kullanın:

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

8

Php> 5.4 için basit bir yol: Facebook grafikte olduğu gibi

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

Tarayıcıda sonuç

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

@Madbreaks, php dosyasında iyi yazdırır, facebook gibi aynı json dosyasına yazmanıza gerek yoktur.
dknepa

6

Kullan <pre>birlikte json_encode()ve JSON_PRETTY_PRINTseçenek:

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

6

Mevcut JSON ( $ugly_json) varsa

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

5

Tam renkli çıktıya sahip olun: Küçük Çözüm

Kod:

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

birkaç hata olmasına rağmen bu çok yardımcı oldu. Onları düzelttim ve şimdi bir cazibe gibi çalışıyor ve işlev hiç de büyük değil! teşekkürler Ajay
Daniel

sadece kimse bunu kullanmak istiyorsa düzeltmeler hakkında yorum yapmak için ... ikinci ve üçüncü if durumunda bir doğrulama denetimi $ c> 1 ekleyin ve son yankı eğer is_array ($ s) içine sarın. kapsama alınmalı ve Başlatılmamış dize uzaklığı hatası almamalısınız.
Daniel

5

Aşağıdakilere bir json dizesi geçirerek oldukça temiz görünümlü ve hoş bir şekilde girintili çıktı almak için geçiş deyiminde Kendall Hopkins'in cevabını biraz değiştirebilirsiniz:

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;

}

Şimdi prettyPrint ($ your_json_string) fonksiyonunu çalıştırın; php inline ve çıktı tadını çıkarın. Minimalistseniz ve herhangi bir nedenden dolayı parantezleri sevmiyorsanız , $ char'daki en üstteki üç anahtar kutusundaki $char.="<br>";ile değiştirerek bunlardan kolayca kurtulabilirsiniz $char="<br>";. İşte Calgary şehri için bir google maps API çağrısı için ne olsun

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

Bu çok güzel teşekkürler. Hafif bir iyileştirme eklemeyi düşündüğüm bir şey: $ indent = "-----" için bir var kullanmaktır, sonra bunu kullanın (kodun farklı yerlerinde "-----" yerine)
gvanto

3

Aşağıdaki gibi yapabilirsiniz.

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

Yukarıda Facebook gibi bir tür çıktı.

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

a_valBir dizi veya nesne ise ne olur ?
Zach Rattner

1
Sorudaki Json'u kullanarak bir örnek cevapladım, cevabımı yakında güncelleyeceğim.
Jake

3

Özyinelemeli bir çözüm için klasik çanta. Benimki burada:

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

Kullanımı:

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

Şerefe


3

Bu çözüm 'gerçekten güzel' JSON yapar. OP'nin tam olarak ne istediğini değil, JSON'u daha iyi görselleştirmenizi sağlar.

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

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

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

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

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

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

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

}



1

PHP için print_r baskı

Örnek 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);yeni satır karakterleriyle önceden hazırlanmış verileri döndürür. Bu komut satırı girişi için yararlıdır, ancak keşfettiğiniz gibi tarayıcıda hoş görünmüyor. Tarayıcı, yeni satırları kaynak olarak kabul edecektir (ve dolayısıyla sayfa kaynağını görüntülemek gerçekten güzel JSON'u gösterecektir), ancak tarayıcılarda çıktıyı biçimlendirmek için kullanılmaz. Tarayıcılar HTML gerektirir.

2 - bu fuction github'u kullanın

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

Benim için işe yarayan şey şudur:

Test.php içeriği:

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

çıktı:

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
)

Ayrıca html'de "pre" etiketinin kullanıldığına dikkat edin.

Birisine yardımcı olan umarım


2
Bu soruya cevap vermiyor. Biçimlendirilmiş JSON yazdırmıyorsunuz, değişkenliklere atıyorsunuz.
Madbreaks

0

JSON verilerini formatlamanın en iyi yolu şudur!

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

$ Yanıtını JSON'a dönüştürülmesi gereken Verilerinizle değiştirin


0

PHP sürüm 5.3 veya daha önceki sürümleri çalıştıranlar için aşağıdakileri deneyebilirsiniz:

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

echo $pretty_json;

-4

MVC ile çalışıyorsanız

bunu kontrolörünüzde yapmayı deneyin

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

/ getLatestUsers öğesini çağırırsanız güzel bir JSON çıktısı alırsınız;)


yankıdan sonra benim yorum bakın görmek oldukça printend
webmaster

1
MVC, JSON çıktısıyla ilgisi olmayan bir çerçeve tasarımı türüdür.
Maciej Paprocki

2013 kişiden gelen bir cevap;)
webmaster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.