专栏首页技术博文php JSON数据格式化输出方法

php JSON数据格式化输出方法

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": "女"
        }
    ]
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ueditor富文本编辑器 修改框宽度和高度的方法

    在使用ueditor的时候,用的textarea <textarea name="content" id="myEditor">这里写这条规则的回复内容</te...

    joshua317
  • linux下添加定时任务

    linux下定时执行任务的方法  在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内...

    joshua317
  • 关于inodes占用100%的问题及解决方法

    系统:Centos;一般的Linux系统也可以用这种方法。 情况描述:今天session文件写入时,写入不了,而且连接到服务器上开启服务都开不了,起始以为磁盘空...

    joshua317
  • centos6.9 rabbitmq设置SSL

     由于安全团队要求,需要给rabbitmq加上SSL,java代码使用ssl秘钥进行连接。

    py3study
  • rabbitmq-3.7.7安装过程

    rabbtmq 依赖于erlang,rabbitmq 3.7.7 版本对erlang的依赖关系参见:http://www.rabbitmq.com/which-...

    冬天里的懒猫
  • ​Linux下安装RabbitMQ

    java之旅
  • rabbitmq学习第一步win10下安装rabbitmq

    rabbitmq是目前比较流行的中间件,接下来要好好学学如何使用rabbitmq。首先呢学会win10安装rabbitmq。

    用户1956326
  • CentOs7.3 搭建 RabbitMQ 3.6 单机多实例服务

    老七Linux
  • Java的String类中提到的代码点,代码单元到底是什么?

    unicode是计算机科学领域里的一项业界标准,包括字符集、编码方案等。计算机采用八比特一个字节,一个字节最大整数是255,还要表示中文一个字也是不够的,至少需...

    JavaEdge
  • RabbitMQ消息队列部署与配置基础

    “每个理性的IT人士都置顶了吴柯的运维笔记” RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列...

    吴柯

扫码关注云+社区

领取腾讯云代金券