原文鏈接:[php JSON數據格式化方法](http://blog.csdn.net/fdipzone/article/details/28766357)
* * * * *
php 的json_encode能把數組轉換為json格式的字符串。字符串沒有縮進,中文會轉為unicode編碼,例如\u975a\u4ed4。人閱讀比較困難。現在這個方法在json_encode的基礎上再進行一次美化處理。使人能方便閱讀內容。
* * * * *
**1. 使用 json_encode 輸出**
~~~
<?php
header('content-type:application/json;charset=utf8');
$arr = array(
'status' => true,
'errMsg' => '',
'member' =>array(
array(
'name' => '李逍遙',
'gender' => '男'
),
array(
'name' => '趙靈兒',
'gender' => '女'
)
)
);
echo json_encode($arr);
?>
~~~
**輸出:**
~~~
{"status":true,"errMsg":"","member":[{"name":"\u674e\u900d\u9065","gender":"\u7537"},{"name":"\u8d75\u7075\u513f","gender":"\u5973"}]}
~~~
可以看出,這種格式人閱讀很困難。
* * * * *
**2. 使用 jsonFormat 輸出**
~~~
<?php
/** Json數據格式化
* @param Mixed $data 數據
* @param String $indent 縮進字符,默認4個空格
* @return JSON
*/
function jsonFormat($data, $indent=null){
// 對數組中每個元素遞歸進行urlencode操作,保護中文字符
array_walk_recursive($data, 'jsonFormatProtect');
// json encode
$data = json_encode($data);
// 將urlencode的內容進行urldecode
$data = urldecode($data);
// 縮進處理
$ret = '';
$pos = 0;
$length = strlen($data);
$indent = isset($indent)? $indent : ' ';
$newline = "\n";
$prevchar = '';
$outofquotes = true;
for($i=0; $i<=$length; $i++){
$char = substr($data, $i, 1);
if($char=='"' && $prevchar!='\\'){
$outofquotes = !$outofquotes;
}elseif(($char=='}' || $char==']') && $outofquotes){
$ret .= $newline;
$pos --;
for($j=0; $j<$pos; $j++){
$ret .= $indent;
}
}
$ret .= $char;
if(($char==',' || $char=='{' || $char=='[') && $outofquotes){
$ret .= $newline;
if($char=='{' || $char=='['){
$pos ++;
}
for($j=0; $j<$pos; $j++){
$ret .= $indent;
}
}
$prevchar = $char;
}
return $ret;
}
/** 將數組元素進行urlencode
* @param String $val
*/
function jsonFormatProtect(&$val){
if($val!==true && $val!==false && $val!==null){
$val = urlencode($val);
}
}
header('content-type:application/json;charset=utf8');
$arr = array(
'status' => true,
'errMsg' => '',
'member' =>array(
array(
'name' => '李逍遙',
'gender' => '男'
),
array(
'name' => '趙靈兒',
'gender' => '女'
)
)
);
echo jsonFormat($arr);
?>
~~~
**輸出:**
~~~
{
"status":true,
"errMsg":"",
"member":[
{
"name":"李逍遙",
"gender":"男"
},
{
"name":"趙靈兒",
"gender":"女"
}
]
}
~~~
* * * * *
php5.4 以后,json_encode增加了JSON_UNESCAPED_UNICODE , JSON_PRETTY_PRINT 等幾個常量參數。使顯示中文與格式化更方便。
~~~
header('content-type:application/json;charset=utf8');
$arr = array(
'status' => true,
'errMsg' => '',
'member' =>array(
array(
'name' => '李逍遙',
'gender' => '男'
),
array(
'name' => '趙靈兒',
'gender' => '女'
)
)
);
echo json_encode($arr, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
~~~
**輸出:**
~~~
{
"status": true,
"errMsg": "",
"member": [
{
"name": "李逍遙",
"gender": "男"
},
{
"name": "趙靈兒",
"gender": "女"
}
]
}
~~~
* * * * *
**JSON常量參數說明:**
以下常量表示了 json_last_error() 所返回的錯誤類型。
~~~
JSON_ERROR_NONE (integer)
沒有錯誤發生。自 PHP 5.3.0 起生效。
JSON_ERROR_DEPTH (integer)
到達了最大堆棧深度。自 PHP 5.3.0 起生效。
JSON_ERROR_STATE_MISMATCH (integer)
出現了下溢(underflow)或者模式不匹配。自 PHP 5.3.0 起生效。
JSON_ERROR_CTRL_CHAR (integer)
控制字符錯誤,可能是編碼不對。自 PHP 5.3.0 起生效。
JSON_ERROR_SYNTAX (integer)
語法錯誤。 自 PHP 5.3.0 起生效。
JSON_ERROR_UTF8 (integer)
異常的 UTF-8 字符,也許是因為不正確的編碼。 此常量自 PHP 5.3.1 起生效。
~~~
* * * * *
下面的常量可以和 json_encode() 的 form 選項結合使用。
~~~
JSON_HEX_TAG (integer)
所有的 < 和 > 轉換成 \u003C 和 \u003E。 自 PHP 5.3.0 起生效。
JSON_HEX_AMP (integer)
所有的 & 轉換成 \u0026。 自 PHP 5.3.0 起生效。
JSON_HEX_APOS (integer)
所有的 ' 轉換成 \u0027。 自 PHP 5.3.0 起生效。
JSON_HEX_QUOT (integer)
所有的 " 轉換成 \u0022。 自 PHP 5.3.0 起生效。
JSON_FORCE_OBJECT (integer)
使一個非關聯數組輸出一個類(Object)而非數組。 在數組為空而接受者需要一個類(Object)的時候尤其有用。 自 PHP 5.3.0 起生效。
JSON_NUMERIC_CHECK (integer)
將所有數字字符串編碼成數字(numbers)。 自 PHP 5.3.3 起生效。
JSON_BIGINT_AS_STRING (integer)
將大數字編碼成原始字符原來的值。 自 PHP 5.4.0 起生效。
JSON_PRETTY_PRINT (integer)
用空白字符格式化返回的數據。 自 PHP 5.4.0 起生效。
JSON_UNESCAPED_SLASHES (integer)
不要編碼 /。 自 PHP 5.4.0 起生效。
JSON_UNESCAPED_UNICODE (integer)
以字面編碼多字節 Unicode 字符(默認是編碼成 \uXXXX)。 自 PHP 5.4.0 起生效。
~~~
* * * * *