用PHP打印JSON
我正在构建一个将JSON数据提供给另一个脚本的PHP脚本。 我的脚本将数据构建到一个大的关联数组中,然后使用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中执行此操作? Facebook上的某个人似乎已经明白了。
PHP 5.4提供了与json_encode()
调用一起使用的JSON_PRETTY_PRINT
选项。
http://php.net/manual/en/function.json-encode.php
<?php
...
$json_string = json_encode($data, JSON_PRETTY_PRINT);
此函数将采用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;
}
许多用户建议您使用
echo json_encode($results, JSON_PRETTY_PRINT);
这是绝对正确的。 但这还不够,浏览器需要了解数据的类型,您可以在将数据回送给用户之前指定标题。
header('Content-Type: application/json');
这将导致格式良好的输出。
或者,如果你喜欢扩展,你可以使用JSONView for Chrome。
链接地址: http://www.djcxy.com/p/1285.html下一篇: Use grep