PHP 生成JSON 格式主要使用json_encode()函數。這個函數的輸入參數支持PHP數組和對象類型。json
查閱網上的例子一般都是使用數組的,也有個別使用對象生成。但實際項目中,咱們要生成的JSON格式每每比較複雜,有多層的嵌套,並且一般須要包含一個json根節點。在這種狀況下若是使用數組實際上是很是困難的,由於把數據包裝成適合的數組格式本就很是困難。數組
怎麼辦呢?答案是使用對象進行封裝,利用PHP很是鬆散的弱類型特色,將能夠很是輕鬆而且清晰的實現JSON進行生成。函數
1.首先定義一個類,名稱隨便,只要一個空的類定義便可,我習慣命名爲JsonObject。編碼
class JsonObjecturl
{code
}對象
2.而後就可使用這個類啦。字符串
舉個簡單的例子,好比咱們要生成這樣一個json字符串:{"Person":{"Name":"ZangKaifeng","Sex":"男"}}class
代碼以下:命名
$jsonString=new JsonObject();
$jsonString->Person=new JsonObject();
$jsonString->Person->Name="ZangKaifeng";
$jsonString->Person->Sex=urlencode("男");
echo urldecode( json_encode($jsonString));
大功告成了。是否是很是的簡單和結構清晰呢?若是裏面遇到json數組類型的也是同樣的處理方式。之後遇到再複雜的JSON格式也不怕了。
運行之後問題又來了,輸出的json字符串中文是相似這種:\u8fd9,不是咱們想要的中文。怎麼辦呢?須要先對非英文字符進行編碼,使用urlencode函數。而後在對生成的json進行解碼就能夠了,具體修改代碼以下:
$jsonString=new JsonObject();
$jsonString->Person=new JsonObject();
$jsonString->Person->Name="ZangKaifeng";
$jsonString->Person->Sex="男";
echo json_encode($jsonString);
本覺得沒問題了,再輸出網址的時候又遇到到了問題,例如要在json中包含一個網址:http://www.abc.com/a.jpg,出問題了。通過json_encode函數後,/ 都被加了轉移字符,變成這個樣子:http:\/\/www.abc.com\/a.jpg。如何解決呢?辦法以下:
json_encode函數有兩個參數,咱們添加第二個參數就能夠了。不過這個只能應用在PHP 5.4.0以上。參數由如下常量定義:JSON_HEX_QUOT
, JSON_HEX_TAG
, JSON_HEX_AMP
, JSON_HEX_APOS
, JSON_NUMERIC_CHECK
, JSON_PRETTY_PRINT
,JSON_UNESCAPED_SLASHES
, JSON_FORCE_OBJECT
, JSON_UNESCAPED_UNICODE
爲了解決咱們的問題,只須要使用JSON_UNESCAPED_SLASHES常量便可,代碼以下:
json_encode($jsonString,JSON_UNESCAPED_SLASHES);
咱們發現這些常量裏有一個JSON_UNESCAPED_UNICODE,這個名字看起來跟編碼有關係,沒錯,使用這個常量就能夠解決咱們以前說的中文編碼的問題了,能夠拋棄urlencode和urldecode了,真是太棒了。
再補充一句:json_encode只支持兩個參數,因此要使用多個常量怎麼辦呢?辦法就是多個常量直接用|分隔。以下代碼就能夠同時解決斜線和中文的問題啦:
json_encode($jsonString,JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
至於其餘常量都是作什麼用的,你們本身慢慢研究吧。