PHP के साथ सुंदर मुद्रण JSON


587

मैं एक PHP स्क्रिप्ट का निर्माण कर रहा हूँ जो JSON डेटा को किसी अन्य स्क्रिप्ट में फीड करती है। मेरी स्क्रिप्ट डेटा को एक बड़े सहयोगी सरणी में बनाती है, और फिर डेटा का उपयोग करके आउटपुट देती है json_encode। यहाँ एक उदाहरण स्क्रिप्ट है:

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

उपरोक्त कोड निम्न आउटपुट देता है:

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

यदि आपके पास डेटा की थोड़ी मात्रा है, तो यह बहुत अच्छा है, लेकिन मैं इन पंक्तियों के साथ कुछ पसंद करूंगा:

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

वहाँ एक तरीका है बदसूरत हैक के बिना PHP में ऐसा करने के लिए? ऐसा लगता है कि फेसबुक पर किसी ने इसे समझ लिया है।


26
5.4 से पहले पीएचपी के लिए, आप वापस आने में उपयोग कर सकते हैं upgradephp के रूप मेंup_json_encode($data, JSON_PRETTY_PRINT);
मारियो

6
हेडर का उपयोग ('सामग्री-प्रकार: अनुप्रयोग / json'); बनाता ब्राउज़र सुंदर प्रिंट
partho

4
Juy 2018 के अनुसार, Content-Type: application/jsonहेडर भेजने से फ़ायरफ़ॉक्स अपने आंतरिक JSON पार्सर का उपयोग करके परिणाम दिखाएगा, जबकि क्रोम सादे पाठ को दिखाता है। +1 फ़ायरफ़ॉक्स!
andresz

जवाबों:


1126

PHP 5.4 कॉल के JSON_PRETTY_PRINTसाथ उपयोग के लिए विकल्प प्रदान करता है json_encode()

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

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

33
धन्यवाद, यह अभी करने का सबसे अच्छा तरीका है। मैं php 5.4 वापस नहीं था जब मैंने यह सवाल पूछा था ...
Zach Rattner

9
5.5.3 यहाँ, केवल वर्णों के बीच थोड़ा सा अंतर जोड़ने के लिए लगता है, कोई वास्तविक इंडेंटिंग नहीं।

35
JSON में HTML लाइन विराम शामिल नहीं है, जबकि JSON में नईलाइन वर्ण मान्य हैं। यदि आप JSON को एक वेब पेज पर प्रदर्शित करना चाहते हैं, तो स्वयं Newline वर्णों पर एक स्ट्रिंग प्रतिस्थापन करें या फिर JSON को एक <pre> ... </ pre> तत्व में रखें। वाक्यविन्यास संदर्भ के लिए json.org देखें ।
एखिलायबी

13
यदि आप ब्राउज़र को बहुत अच्छी तरह से मुद्रित JSON प्रदर्शित करना चाहते हैं तो प्रतिक्रिया Content-Typeदेना न भूलें application/json
पीजूसन

6
@countfloortiles यह काम नहीं करेगा सीधे आपको अपने आउटपुट को <pre>टैग में संलग्न करने की आवश्यकता है जैसे<?php ... $json_string = json_encode($data, JSON_PRETTY_PRINT); echo "<pre>".$json_string."<pre>";
सलमान मोहम्मद

187

यह फ़ंक्शन JSON स्ट्रिंग लेगा और इसे बहुत ही पठनीय रूप से इंडेंट करेगा। यह भी अभिसरण होना चाहिए,

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

इनपुट

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

उत्पादन

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

कोड

function prettyPrint( $json )
{
    $result = '';
    $level = 0;
    $in_quotes = false;
    $in_escape = false;
    $ends_line_level = NULL;
    $json_length = strlen( $json );

    for( $i = 0; $i < $json_length; $i++ ) {
        $char = $json[$i];
        $new_line_level = NULL;
        $post = "";
        if( $ends_line_level !== NULL ) {
            $new_line_level = $ends_line_level;
            $ends_line_level = NULL;
        }
        if ( $in_escape ) {
            $in_escape = false;
        } else if( $char === '"' ) {
            $in_quotes = !$in_quotes;
        } else if( ! $in_quotes ) {
            switch( $char ) {
                case '}': case ']':
                    $level--;
                    $ends_line_level = NULL;
                    $new_line_level = $level;
                    break;

                case '{': case '[':
                    $level++;
                case ',':
                    $ends_line_level = $level;
                    break;

                case ':':
                    $post = " ";
                    break;

                case " ": case "\t": case "\n": case "\r":
                    $char = "";
                    $ends_line_level = $new_line_level;
                    $new_line_level = NULL;
                    break;
            }
        } else if ( $char === '\\' ) {
            $in_escape = true;
        }
        if( $new_line_level !== NULL ) {
            $result .= "\n".str_repeat( "\t", $new_line_level );
        }
        $result .= $char.$post;
    }

    return $result;
}

84

कई उपयोगकर्ताओं ने सुझाव दिया कि आप उपयोग करते हैं

echo json_encode($results, JSON_PRETTY_PRINT);

जो बिलकुल सही है। लेकिन यह पर्याप्त नहीं है, ब्राउज़र को डेटा के प्रकार को समझने की आवश्यकता है, आप उपयोगकर्ता को डेटा वापस गूंजने से ठीक पहले हेडर निर्दिष्ट कर सकते हैं।

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

यह एक अच्छी तरह से स्वरूपित आउटपुट में परिणाम देगा।

या, यदि आपको एक्सटेंशन पसंद हैं तो आप Chrome के लिए JSONView का उपयोग कर सकते हैं।


3
केवल हेडर सेट करें और फ़ायरफ़ॉक्स इसे पूरी तरह से अपने स्वयं के आंतरिक JSON डिबगिंग पार्सर का उपयोग करके दिखाएगा, JSON सामग्री को छूने की कोई आवश्यकता नहीं है! धन्यवाद!!
andreszs

1
क्रोम में भी काम करता है। धन्यवाद।
डॉन दिलंगा

41

मेरी भी यही समस्या थी।

वैसे भी मैंने यहाँ सिर्फ json स्वरूपण कोड का उपयोग किया है:

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

अच्छी तरह से काम करता है कि मुझे इसके लिए क्या चाहिए।

और एक अधिक बनाए रखा संस्करण: https://github.com/GerHobbelt/nicejson-php


मैंने github.com/GerHobbelt/nicejson-php की कोशिश की और यह PHP 5.3 में बहुत अच्छा काम करता है।
प्रो। फाल्कन कॉन्ट्रैक्ट ने

1
यदि आप PHP7.0 (और ऊपर) पर हैं और अभी भी कस्टम इंडेंटेशन के साथ JSON को प्रिंट करने की आवश्यकता है, तो localheinz.com/blog/2018/01/04/… को मदद करनी चाहिए।
स्थानीयनाज

40

मुझे पता है कि यह सवाल एक साहचर्य सरणी को एक सुंदर-स्वरूपित JSON स्ट्रिंग में कैसे एन्कोड किया जाए, इसलिए यह सीधे सवाल का जवाब नहीं देता है, लेकिन अगर आपके पास एक स्ट्रिंग है जो JSON प्रारूप में पहले से है, तो आप इसे बहुत सरल बना सकते हैं डिकोडिंग और इसे फिर से एन्कोडिंग करके (PHP> = 5.4 की आवश्यकता है):

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

उदाहरण:

header('Content-Type: application/json');
$json_ugly = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
$json_pretty = json_encode(json_decode($json_ugly), JSON_PRETTY_PRINT);
echo $json_pretty;

यह आउटपुट:

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

धन्यवाद, यह केवल तभी काम करता है जब मैं इसे php ब्लॉक के शीर्ष पर जोड़ता हूं ... शीर्ष लेख ('सामग्री-प्रकार: अनुप्रयोग / json');
डेयल्डीन

2
@DeyaEldeen यदि आप उस शीर्ष लेख का उपयोग नहीं करते हैं, तो PHP ब्राउज़र को बताएगा कि यह HTML भेज रहा है, इसलिए आपको फॉर्मेट किए गए JSON स्ट्रिंग को देखने के लिए पृष्ठ स्रोत देखना होगा। मुझे लगता है कि समझा गया था, लेकिन मुझे नहीं लगता है। मैंने इसे अपने उत्तर में जोड़ लिया है।
माइक

और कोई भी / यूनिक्स / लिनक्स शेल में लॉग / फाइल की समीक्षा / पुनरावृत्ति करता है, यह यहाँ समाधान है! अच्छा लग रहा है, @ माइक, पढ़ने में आसान बनाता है!।
फ्यूजन

@ fusion27 मुझे वास्तव में यकीन नहीं है कि आप किन लॉग फ़ाइलों का उल्लेख कर रहे हैं। मैंने JSON में कुछ भी लॉग करने वाले किसी भी प्रोग्राम के बारे में कभी नहीं सुना है।
माइक

@ माइक, यह एक त्वरित- n- गंदा PHP है जिसे मैंने अनुरोध निकाय (जो एक क्रमबद्ध JSON स्ट्रिंग है) में जोड़ दिया है, मेरे PHP को एक टेक्स्टफाइल में पोस्ट किया गया है, मैं इसे यूनिक्स शेल में पूंछता हूं ताकि मैं लाइव POST देख सकूं। मैं आपकी चाल को प्रारूपित करने के लिए उपयोग कर रहा हूं कि JSON पाठ फ़ाइल को और अधिक प्रयोग करने योग्य बनाता है।
फ्यूजन

24

कई जवाबों को एक साथ जोड़कर मौजूदा जोंस की मेरी जरूरत को पूरा करता है :

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
यहाँ ऐसा करने के लिए थोड़ा रैपर फंक्शन है:function json_print($json) { return '<pre>' . json_encode(json_decode($json), JSON_PRETTY_PRINT) . '</pre>'; }
डैनी बेकेट

11

मैंने संगीतकार से कोड लिया: https://github.com/composer/composer/blob/master/src/Composer/Json/JsonFile.php और Goodjson: https://github.com/Gerbobbelt/nicejson-php/blob / मास्टर / nicejson.php संगीतकार कोड अच्छा है क्योंकि यह 5.3 से 5.4 तक धाराप्रवाह अद्यतन करता है, लेकिन यह केवल ऑब्जेक्ट को एन्कोड करता है, जबकि गूडसन जिंग स्ट्रिंग्स लेता है, इसलिए मैंने उन्हें मर्ज कर दिया। कोड का उपयोग json string को और / या ऑब्जेक्ट को एनकोड करने के लिए किया जा सकता है, मैं वर्तमान में इसे 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;
}

यह कैसे किया जाता है! स्वयं का कार्यान्वयन केवल तभी चलता है जब मूल उपलब्ध नहीं है। यदि आप सुनिश्चित हैं कि आपका कोड केवल PHP 5.4 में चलेगा या ऊपर आप JSON_PRETTY_PRINT पर आराम कर सकते हैं
Heroselohim

यह समाधान मुझे त्रुटि देता है (लाइन त्रुटि: सिंटैक्स त्रुटि, अनपेक्षित T_FUNCTION) ऑन लाइन फंक्शन ($ मैच)
ARLabs

संगीतकार ने इसे daveperrett.com/articles/2008/03/11/format-json-with-php से लिया , जो stackoverflow.com/a/6054389/1172545 के समान है ।
लोकलीनज

10

यदि आप फ़ायरफ़ॉक्स पर हैं तो JSONovich स्थापित करें । नहीं वास्तव में एक PHP समाधान मुझे पता है, लेकिन यह विकास के उद्देश्यों / डिबगिंग के लिए चाल करता है।


3
मुझे लगता है कि एक एपि को समर्पित करते समय यह उचित समाधान है। यह दोनों दुनिया का सबसे अच्छा, आसान डिबगिंग देता है क्योंकि आप सब कुछ पढ़ सकते हैं और आप इसके प्रदर्शन सहित बैकेंड के व्यवहार में बदलाव नहीं कर रहे हैं।
डैनियल

सहमत, यह अच्छी तरह से रंगों के साथ स्वरूपित है और बंधनेवाला भी है। बहुत अच्छे से आप PHP के एक बिट के साथ प्राप्त करने की उम्मीद कर सकते हैं
मैथ्यू लॉक

10

मैंने इसका उपयोग किया है:

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

या नीचे दिए अनुसार php हेडर का उपयोग करें:

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: के लिए सरल तरीका

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

ब्राउज़र में परिणाम

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

@Madbreaks, यह php फाइल में अच्छी तरह से प्रिंट होता है, इसे फेसबुक की तरह ही json फाइल में लिखने की जरूरत नहीं है।
डेकेपे

6

के <pre>साथ संयोजन में उपयोग करें json_encode()और JSON_PRETTY_PRINTविकल्प:

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

6

यदि आपके पास मौजूदा JSON ( $ugly_json) है

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

5

रंग पूर्ण उत्पादन है: टिनी समाधान

कोड:

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

यह बहुत उपयोगी था, भले ही इसमें कुछ त्रुटियां थीं। मैंने उन्हें ठीक कर दिया और अब यह एक आकर्षण की तरह काम करता है, और फ़ंक्शन इतना बड़ा नहीं है! धन्यवाद अजय
डैनियल

केवल फ़िक्सेस पर टिप्पणी करने के लिए यदि कोई भी इसका उपयोग करना चाहता है ... दूसरी स्थिति में एक सत्यापन चेक $ c> 1 जोड़ें और यदि स्थिति है, और अंतिम इको एक if_array ($ s) में लपेटता है यदि। इसे कवर किया जाना चाहिए और आपको किसी भी तरह के Uninitialized string ऑफसेट त्रुटि नहीं मिलनी चाहिए।
डैनियल

5

आप निम्न कथन में कन्सल हॉपकिन्स को संशोधित कर सकते हैं कि एक सुंदर साफ दिखने और अच्छी तरह से इंडेंट प्रिंटआउट प्राप्त करने के लिए स्विच स्टेटमेंट में थोड़ा सा उत्तर दें:

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;

}

अब बस फंक्शन रन प्रीप्रिंट ($ your_json_string); अपने php में इनलाइन करें और प्रिंटआउट का आनंद लें। यदि आप एक न्यूनतावादी हैं और किसी कारण से कोष्ठक पसंद नहीं करते हैं, तो आप $ char पर शीर्ष तीन स्विच मामलों में $char.="<br>";साथ की जगह से आसानी से छुटकारा पा सकते हैं $char="<br>";। यहाँ आपको एक गूगल मैप्स के लिए क्या मिलता है एपीआई कॉल कैलगरी शहर के लिए है

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

यह वास्तव में अच्छा है धन्यवाद। मुझे लगता है कि मामूली सुधार को जोड़ने के लिए एक चीज का उपयोग करें: $ इंडेंट = "-----" के लिए एक var का उपयोग करें, फिर उस कोड में अलग-अलग स्थानों में "-----" के बजाय का उपयोग करें
gvanto

3

आप इसे नीचे की तरह कर सकते हैं।

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

ऊपर से फेसबुक की तरह उत्पादन होगा।

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

यदि a_valकोई सरणी या वस्तु है तो क्या होगा ?
Zach Rattner

1
मैंने सवाल में जसन का उपयोग करके एक उदाहरण का जवाब दिया, मैं जल्द ही अपने उत्तर को अपडेट करूंगा।
जेक

3

एक पुनरावर्ती समाधान के लिए क्लासिक मामला। ये मेरा:

class JsonFormatter {
    public static function prettyPrint(&$j, $indentor = "\t", $indent = "") {
        $inString = $escaped = false;
        $result = $indent;

        if(is_string($j)) {
            $bak = $j;
            $j = str_split(trim($j, '"'));
        }

        while(count($j)) {
            $c = array_shift($j);
            if(false !== strpos("{[,]}", $c)) {
                if($inString) {
                    $result .= $c;
                } else if($c == '{' || $c == '[') {
                    $result .= $c."\n";
                    $result .= self::prettyPrint($j, $indentor, $indentor.$indent);
                    $result .= $indent.array_shift($j);
                } else if($c == '}' || $c == ']') {
                    array_unshift($j, $c);
                    $result .= "\n";
                    return $result;
                } else {
                    $result .= $c."\n".$indent;
                } 
            } else {
                $result .= $c;
                $c == '"' && !$escaped && $inString = !$inString;
                $escaped = $c == '\\' ? !$escaped : false;
            }
        }

        $j = $bak;
        return $result;
    }
}

उपयोग:

php > require 'JsonFormatter.php';
php > $a = array('foo' => 1, 'bar' => 'This "is" bar', 'baz' => array('a' => 1, 'b' => 2, 'c' => '"3"'));
php > print_r($a);
Array
(
    [foo] => 1
    [bar] => This "is" bar
    [baz] => Array
        (
            [a] => 1
            [b] => 2
            [c] => "3"
        )

)
php > echo JsonFormatter::prettyPrint(json_encode($a));
{
    "foo":1,
    "bar":"This \"is\" bar",
    "baz":{
        "a":1,
        "b":2,
        "c":"\"3\""
    }
}

चियर्स


3

यह समाधान 'वास्तव में सुंदर' JSON बनाता है। ओपी के लिए पूछ रहा था बिल्कुल नहीं, लेकिन यह आपको JSON बेहतर कल्पना कर सकते हैं।

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

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

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

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

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

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

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

}


2

यदि आप केवल उपयोग करते हैं $json_string = json_encode($data, JSON_PRETTY_PRINT);, तो आपको ब्राउज़र कुछ इस तरह से मिलेगा ( फेसबुक लिंक का उपयोग करके सवाल :)): यहाँ छवि विवरण दर्ज करें

लेकिन अगर आपने JSONView (ऊपर दिए गए PHP विकल्प के बिना भी) जैसे क्रोम एक्सटेंशन का उपयोग किया है , तो आपको एक और अधिक पठनीय डीबग करने योग्य समाधान मिलता है, जहाँ आप प्रत्येक सिंगल JSON ऑब्जेक्ट को इस तरह आसानी से मोड़ / संक्षिप्त कर सकते हैं: यहाँ छवि विवरण दर्ज करें


1

PHP के लिए print_r सुंदर प्रिंट

उदाहरण 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);नईलाइन वर्णों के साथ पूर्व-निर्धारित डेटा देता है। यह कमांड लाइन इनपुट के लिए सहायक है, लेकिन जैसा कि आपने खोजा है कि ब्राउज़र के भीतर उतना सुंदर नहीं है। ब्राउजर नईलाइन्स को सोर्स के रूप में स्वीकार करेगा (और इस प्रकार, पेज सोर्स को देखने से वास्तव में सुंदर JSON दिखाई देगा), लेकिन उनका उपयोग ब्राउज़र में आउटपुट को फॉर्मेट करने के लिए नहीं किया जाता है। ब्राउज़रों को HTML की आवश्यकता होती है।

2 - इस fuction github का उपयोग करें

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

निम्नलिखित मेरे लिए काम किया है:

परीक्षण की सामग्री।

<html>
<body>
Testing JSON array output
  <pre>
  <?php
  $data = array('a'=>'apple', 'b'=>'banana', 'c'=>'catnip');
  // encode in json format 
  $data = json_encode($data);

  // json as single line
  echo "</br>Json as single line </br>";
  echo $data;
  // json as an array, formatted nicely
  echo "</br>Json as multiline array </br>";
  print_r(json_decode($data, true));
  ?>
  </pre>
</body>
</html>

उत्पादन:

Testing JSON array output


Json as single line 
{"a":"apple","b":"banana","c":"catnip"}
Json as multiline array 
Array
(
    [a] => apple
    [b] => banana
    [c] => catnip
)

Html में "पूर्व" टैग के उपयोग पर भी ध्यान दें।

आशा है कि किसी की मदद करता है


2
इस सवाल का जवाब नहीं है। आप vars को डंप कर रहे हैं, JSON को फॉर्मेट नहीं कर रहे हैं।
मैडब्रेक्स

0

JSON डेटा फॉर्मेट करने का सबसे अच्छा तरीका है!

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

अपने डेटा के साथ $ प्रतिक्रिया को बदलें जिसे JSON में परिवर्तित करना आवश्यक है


0

PHP संस्करण 5.3 या उससे पहले चलने वालों के लिए, आप नीचे कोशिश कर सकते हैं:

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

echo $pretty_json;

-4

यदि आप MVC के साथ काम कर रहे हैं

अपने कंट्रोलर में ऐसा करने की कोशिश करें

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

तब यदि आप कॉल / getLatestUsers आप एक सुंदर JSON उत्पादन मिल जाएगा;)


मेरी टिप्पणी को प्रतिध्वनि के बाद देखें जहां यह बहुत सुंदर प्रिंट हो रहा है
वेबमास्टर

1
MVC फ्रेमवर्क डिज़ाइन का एक प्रकार है, JSON के आउटपुट के साथ कुछ नहीं करना है।
मिकीज पप्रोकी

2013 लोगों से इसका जवाब;)
वेबमास्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.