如何使用编程方式美化JSON?

44

您可能会说这是这个问题的重复,但原始问题在那里没有得到解答。问题的重要部分是:是否有编程方式来美化json?

是否有任何php函数可以实现?原生或自制?


我想知道你是否能够调整它,使其适用于JSON:http://beautifyphp.sourceforge.net/docs/ - citizen conn
json_decode后跟var_dump的输出缓冲可能可行,但不是最干净的解决方案。 - Michael Mior
2
nl2br(json_encode(json_decode('{"test":[{"my":"json"},{"string":"with"},{"pretty":"print"}]}'), JSON_PRETTY_PRINT))。虽然不谈论性能,但请自行对您的JSON进行性能测试。 - Fr0zenFyr
5个回答

164

json_encode() 函数有一个标志 JSON_PRETTY_PRINT

echo json_encode($data, JSON_PRETTY_PRINT);

4
为了更好地排版,您可以将编码后的JSON输出放置在<pre>标签之间。类似于<pre>YOUR_JSONDATA</pre>。 - Philipos D.

3
我创建了一个非破坏性的JSON美化工具,支持多种深度级别。
/**
 * JSON beautifier
 * 
 * @param string    The original JSON string
 * @param   string  Return string
 * @param string    Tab string
 * @return string
 */
function pretty_json($json, $ret= "\n", $ind="\t") {

    $beauty_json = '';
    $quote_state = FALSE;
    $level = 0; 

    $json_length = strlen($json);

    for ($i = 0; $i < $json_length; $i++)
    {                               

        $pre = '';
        $suf = '';

        switch ($json[$i])
        {
            case '"':                               
                $quote_state = !$quote_state;                                                           
                break;

            case '[':                                                           
                $level++;               
                break;

            case ']':
                $level--;                   
                $pre = $ret;
                $pre .= str_repeat($ind, $level);       
                break;

            case '{':

                if ($i - 1 >= 0 && $json[$i - 1] != ',')
                {
                    $pre = $ret;
                    $pre .= str_repeat($ind, $level);                       
                }   

                $level++;   
                $suf = $ret;                                                                                                                        
                $suf .= str_repeat($ind, $level);                                                                                                   
                break;

            case ':':
                $suf = ' ';
                break;

            case ',':

                if (!$quote_state)
                {  
                    $suf = $ret;                                                                                                
                    $suf .= str_repeat($ind, $level);
                }
                break;

            case '}':
                $level--;   

            case ']':
                $pre = $ret;
                $pre .= str_repeat($ind, $level);
                break;

        }

        $beauty_json .= $pre.$json[$i].$suf;

    }

    return $beauty_json;

}   

如果是 case ':',需要评估 quote_state,否则时间戳将会损坏... - flederwiesel

3

我刚刚也有同样的问题。但是,就像你一样,我的php版本低于5.4。Zend框架有Zend_Json::prettyPrint()函数。它非常好用。


2

这个简单的技巧对我很有用,我不想使用任何额外的库或函数:

$json = '{"status":"0","status_translated":"Request successful!","data":"1"}';
$json_beautified = str_replace(array("{", "}", '","'), array("{<br />&nbsp;&nbsp;&nbsp;&nbsp;", "<br />}", '",<br />&nbsp;&nbsp;&nbsp;&nbsp;"'), $json);

结果如下所示:

{
    "status":"0",
    "status_translated":"Request successful!",
    "data":"1"
}

这仅适用于只有1个步骤深度的JSON代码,希望对您有所帮助。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接