php 的json_encode能把数组转换为json格式的字符串。字符串没有缩进,中文会转为unicode编码,例如\u975a\u4ed4。人阅读比较困难。现在这个方法在json_encode的基础上再进行一次美化处理。使人能方便阅读内容。
1. 使用 json_encode 输出
1 <?php
2
3 header('content-type:application/json;charset=utf8');
4
5 $arr = array(
6 'status' => true,
7 'errMsg' => '',
8 'member' =>array(
9 array(
10 'name' => '李逍遥',
11 'gender' => '男'
12 ),
13 array(
14 'name' => '赵灵儿',
15 'gender' => '女'
16 )
17 )
18 );
19
20 echo json_encode($arr);
21
22 ?>
输出结果为:
{"status":true,"errMsg":"","member":[{"name":"\u674e\u900d\u9065","gender":"\u7537"},{"name":"\u8d75\u7075\u513f","gender":"\u5973"}]}
2. 使用 jsonFormat 输出
1 <?php
2
3 /** Json数据格式化
4 * @param Mixed $data 数据
5 * @param String $indent 缩进字符,默认4个空格
6 * @return JSON
7 */
8 function jsonFormat($data, $indent=null){
9
10 // 对数组中每个元素递归进行urlencode操作,保护中文字符
11 array_walk_recursive($data, 'jsonFormatProtect');
12
13 // json encode
14 $data = json_encode($data);
15
16 // 将urlencode的内容进行urldecode
17 $data = urldecode($data);
18
19 // 缩进处理
20 $ret = '';
21 $pos = 0;
22 $length = strlen($data);
23 $indent = isset($indent)? $indent : ' ';
24 $newline = "\n";
25 $prevchar = '';
26 $outofquotes = true;
27
28 for($i=0; $i<=$length; $i++){
29
30 $char = substr($data, $i, 1);
31
32 if($char=='"' && $prevchar!='\\'){
33 $outofquotes = !$outofquotes;
34 }elseif(($char=='}' || $char==']') && $outofquotes){
35 $ret .= $newline;
36 $pos --;
37 for($j=0; $j<$pos; $j++){
38 $ret .= $indent;
39 }
40 }
41
42 $ret .= $char;
43
44 if(($char==',' || $char=='{' || $char=='[') && $outofquotes){
45 $ret .= $newline;
46 if($char=='{' || $char=='['){
47 $pos ++;
48 }
49
50 for($j=0; $j<$pos; $j++){
51 $ret .= $indent;
52 }
53 }
54
55 $prevchar = $char;
56 }
57
58 return $ret;
59 }
60
61 /** 将数组元素进行urlencode
62 * @param String $val
63 */
64 function jsonFormatProtect(&$val){
65 if($val!==true && $val!==false && $val!==null){
66 $val = urlencode($val);
67 }
68 }
69
70 header('content-type:application/json;charset=utf8');
71
72 $arr = array(
73 'status' => true,
74 'errMsg' => '',
75 'member' =>array(
76 array(
77 'name' => '李逍遥',
78 'gender' => '男'
79 ),
80 array(
81 'name' => '赵灵儿',
82 'gender' => '女'
83 )
84 )
85 );
86
87 echo jsonFormat($arr);
88
89 ?>
输出结果为:
{
"status":true,
"errMsg":"",
"member":[
{
"name":"李逍遥",
"gender":"男"
},
{
"name":"赵灵儿",
"gender":"女"
}
]
}
3.php5.4 以后,json_encode增加了JSON_UNESCAPED_UNICODE , JSON_PRETTY_PRINT 等几个常量参数。使显示中文与格式化更方便。
1 header('content-type:application/json;charset=utf8');
2
3 $arr = array(
4 'status' => true,
5 'errMsg' => '',
6 'member' =>array(
7 array(
8 'name' => '李逍遥',
9 'gender' => '男'
10 ),
11 array(
12 'name' => '赵灵儿',
13 'gender' => '女'
14 )
15 )
16 );
17
18 echo json_encode($arr, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
输出结果为:
{
"status": true,
"errMsg": "",
"member": [
{
"name": "李逍遥",
"gender": "男"
},
{
"name": "赵灵儿",
"gender": "女"
}
]
}