人类可读的 JSON:又名在 json 转储中添加空格和中断

Posted

技术标签:

【中文标题】人类可读的 JSON:又名在 json 转储中添加空格和中断【英文标题】:Human Readable JSON: aka Add spaces and breaks to json dump 【发布时间】:2011-11-15 15:52:55 【问题描述】:

在某个地方是否有一个“简单”的脚本可以获取 json 数据并对其进行格式化以使其更具可读性?

例如:

// $response is a json encoded string.
var_dump($response);

以上内容在一行上输出所有内容。我希望它缩进和隔开,以便于阅读。

【问题讨论】:

如果这只是为了读取 JSON,也许像 JSONView (chrome, firefox, opera) 这样的浏览器插件会有用吗? (还有很多其他类似的插件。) 【参考方案1】:

注意var_dump 和它的简洁表亲var_export 打印换行符。

请记住,默认情况下 html 文档中不显示换行符。在 HTML 上下文中,您需要这样:

echo '<div style="font-family: monospace; white-space:pre;">';
echo htmlspecialchars(var_export($response));
echo '</div>';

php 5.4+ 中,您可以简单地使用 json_encode 的 PRETTY_PRINT 标志:

echo json_encode($response, JSON_PRETTY_PRINT);

同样,在 HTML 上下文中,您必须按上述方式包装它。

【讨论】:

@Matt Anderson 谢谢,添加了一条说明需要更新 php 的注释,并添加了 var_export 很酷的技巧,但我目前使用的是 5.3...我会记住它以备将来使用。【参考方案2】:

将其粘贴到JSONLint.com 并单击验证。

【讨论】:

这似乎是最快最简单的选择...有用的小工具。谢谢! 我更喜欢这个站点:json.parser.online.fr 也就是说,javascript 有一个很好的 JSON 解析函数来执行这个功能。在 PHP 中也有类似的东西会很好。【参考方案3】:

有一个类似的问题,我将一个序列化的 javascript 对象发布到一个 php 脚本,并希望以人类可读的格式将它保存到服务器。

找到 this post on the webdeveloper.com forum 并稍微调整了代码以适应我自己的感受(它需要一个 json 编码的字符串):

function jsonToReadable($json)
    $tc = 0;        //tab count
    $r = '';        //result
    $q = false;     //quotes
    $t = "\t";      //tab
    $nl = "\n";     //new line

    for($i=0;$i<strlen($json);$i++)
        $c = $json[$i];
        if($c=='"' && $json[$i-1]!='\\') $q = !$q;
        if($q)
            $r .= $c;
            continue;
        
        switch($c)
            case '':
            case '[':
                $r .= $c . $nl . str_repeat($t, ++$tc);
                break;
            case '':
            case ']':
                $r .= $nl . str_repeat($t, --$tc) . $c;
                break;
            case ',':
                $r .= $c;
                if($json[$i+1]!='' && $json[$i+1]!='[') $r .= $nl . str_repeat($t, $tc);
                break;
            case ':':
                $r .= $c . ' ';
                break;
            default:
                $r .= $c;
        
    
    return $r;

传入

"object":"array":["one","two"],"sub-object":"one":"string","two":2

返回


    "object": 
        "array": [
            "one",
            "two"
        ],
        "sub-object": 
            "one": "string",
            "two": 2
        
    

【讨论】:

我非常喜欢这个,我将它转换为 Java。享受任何找到这个的人。 gist.github.com/PaulBGD/846d2c4503a7bfc5036a【参考方案4】:

json_encode($response, JSON_PRETTY_PRINT);

现在是 2017 年,我认为这应该是任何使用现代 PHP 版本的人的答案。

请注意,有很多选项可用于根据自己的喜好对 JSON 字符串进行编码。来自php.net: JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR

【讨论】:

【参考方案5】:
echo '<pre>';
print_r(json_decode($response));
echo '</pre>';

太简单了?

【讨论】:

【参考方案6】:

通过python -mjson.tool 传递。

【讨论】:

【参考方案7】:

使用 python 的建议对我来说效果很好。下面是一些使用 PHP 的代码:

function jsonEncode( $data, $pretty = false ) 
    $str = json_encode($data);
    if( $pretty ) 
        $descriptorSpec = array(
                0 => array('pipe', 'r'),  // stdin is a pipe that the child will read from
                1 => array('pipe', 'w'),  // stdout is a pipe that the child will write to
        );
        $fp = proc_open('/usr/bin/python -mjson.tool', $descriptorSpec, $pipes);
        fputs($pipes[0], $str);
        fclose($pipes[0]);
        $str = '';
        while( !feof($pipes[1]) ) 
            $str .= $chunk = fgets($pipes[1], 1024);
        
        fclose($pipes[1]);
    
    return $str;

【讨论】:

以上是关于人类可读的 JSON:又名在 json 转储中添加空格和中断的主要内容,如果未能解决你的问题,请参考以下文章

将 dict 保存为 JSON,以便它们是人类可读的 [重复]

如何以 json 格式(双引号)漂亮地打印(人类可读的打印)Python dict? [复制]

将 JSON 纪元时间转换为本地人类可读日期

在 .htaccess 中启用人类可读的 URL

在 Unix shell 脚本中以可读的 JSON 格式显示 curl 输出

来自python的javascript可读的json