轉:PHP 生成複雜JSON格式 簡單快速方法

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_QUOTJSON_HEX_TAGJSON_HEX_AMPJSON_HEX_APOSJSON_NUMERIC_CHECKJSON_PRETTY_PRINT,JSON_UNESCAPED_SLASHESJSON_FORCE_OBJECTJSON_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);

 

至於其餘常量都是作什麼用的,你們本身慢慢研究吧。

相關文章
相關標籤/搜索