php JSON数据格式化方法

(来源:http://blog.csdn.net/fdipzone/article/details/28766357)

php 的json_encode能把数组转换为json格式的字符串。字符串没有缩进,中文会转为unicode编码,例如\u975a\u4ed4。人阅读比较困难。现在这个方法在json_encode的基础上再进行一次美化处理。使人能方便阅读内容。


1. 使用 json_encode 输出

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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. ?>  
输出:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. {"status":true,"errMsg":"","member":[{"name":"\u674e\u900d\u9065","gender":"\u7537"},{"name":"\u8d75\u7075\u513f","gender":"\u5973"}]}  
可以看出,这种格式人阅读很困难。


2. 使用 jsonFormat 输出

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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. ?>  
输出:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. {  
  2.     "status":true,  
  3.     "errMsg":"",  
  4.     "member":[  
  5.         {  
  6.             "name":"李逍遥",  
  7.             "gender":"男"  
  8.         },  
  9.         {  
  10.             "name":"赵灵儿",  
  11.             "gender":"女"  
  12.         }  
  13.     ]  
  14. }  

php5.4 以后,json_encode增加了JSON_UNESCAPED_UNICODE , JSON_PRETTY_PRINT 等几个常量参数。使显示中文与格式化更方便。

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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);  

输出:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. {  
  2.     "status": true,  
  3.     "errMsg": "",  
  4.     "member": [  
  5.         {  
  6.             "name": "李逍遥",  
  7.             "gender": "男"  
  8.         },  
  9.         {  
  10.             "name": "赵灵儿",  
  11.             "gender": "女"  
  12.         }  
  13.     ]  
  14. }  

JSON常量参数说明:

以下常量表示了 json_last_error() 所返回的错误类型。

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. JSON_ERROR_NONE (integer)  
  2. 没有错误发生。自 PHP 5.3.0 起生效。  
  3.   
  4. JSON_ERROR_DEPTH (integer)  
  5. 到达了最大堆栈深度。自 PHP 5.3.0 起生效。  
  6.   
  7. JSON_ERROR_STATE_MISMATCH (integer)  
  8. 出现了下溢(underflow)或者模式不匹配。自 PHP 5.3.0 起生效。  
  9.   
  10. JSON_ERROR_CTRL_CHAR (integer)  
  11. 控制字符错误,可能是编码不对。自 PHP 5.3.0 起生效。  
  12.   
  13. JSON_ERROR_SYNTAX (integer)  
  14. 语法错误。 自 PHP 5.3.0 起生效。  
  15.   
  16. JSON_ERROR_UTF8 (integer)  
  17. 异常的 UTF-8 字符,也许是因为不正确的编码。 此常量自 PHP 5.3.1 起生效。  

下面的常量可以和 json_encode() 的 form 选项结合使用。

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. JSON_HEX_TAG (integer)  
  2. 所有的 < 和 > 转换成 \u003C 和 \u003E。 自 PHP 5.3.0 起生效。  
  3.   
  4. JSON_HEX_AMP (integer)  
  5. 所有的 & 转换成 \u0026。 自 PHP 5.3.0 起生效。  
  6.   
  7. JSON_HEX_APOS (integer)  
  8. 所有的 ' 转换成 \u0027。 自 PHP 5.3.0 起生效。  
  9.   
  10. JSON_HEX_QUOT (integer)  
  11. 所有的 " 转换成 \u0022。 自 PHP 5.3.0 起生效。  
  12.   
  13. JSON_FORCE_OBJECT (integer)  
  14. 使一个非关联数组输出一个类(Object)而非数组。 在数组为空而接受者需要一个类(Object)的时候尤其有用。 自 PHP 5.3.0 起生效。  
  15.   
  16. JSON_NUMERIC_CHECK (integer)  
  17. 将所有数字字符串编码成数字(numbers)。 自 PHP 5.3.3 起生效。  
  18.   
  19. JSON_BIGINT_AS_STRING (integer)  
  20. 将大数字编码成原始字符原来的值。 自 PHP 5.4.0 起生效。  
  21.   
  22. JSON_PRETTY_PRINT (integer)  
  23. 用空白字符格式化返回的数据。 自 PHP 5.4.0 起生效。  
  24.   
  25. JSON_UNESCAPED_SLASHES (integer)  
  26. 不要编码 /。 自 PHP 5.4.0 起生效。  
  27.   
  28. JSON_UNESCAPED_UNICODE (integer)  
  29. 以字面编码多字节 Unicode 字符(默认是编码成 \uXXXX)。 自 PHP 5.4.0 起生效。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值