PHP 生成複雜JSON格式 簡單快速方法
PHP 生成JSON 格式主要使用json_encode()函式。這個函式的輸入引數支援PHP陣列和物件型別。
查閱網上的例子通常都是使用陣列的,也有個別使用物件生成。但實際專案中,我們要生成的JSON格式往往比較複雜,有多層的巢狀,而且通常需要包含一個json根節點。在這種情況下如果使用陣列其實是非常困難的,因為把資料包裝成適合的陣列格式本就非常困難。
怎麼辦呢?答案是使用物件進行封裝,利用PHP非常鬆散的弱型別特點,將可以非常輕鬆並且清晰的實現JSON進行生成。
1.首先定義一個類,名稱隨便,只要一個空的類定義即可,我習慣命名為JsonObject。
class JsonObject
{
}
2.然後就可以使用這個類啦。
舉個簡單的例子,比如我們要生成這樣一個json字串:{"Person":{"Name":"ZangKaifeng","Sex":"男"}}
程式碼如下:
$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);
至於其他常量都是做什麼用的,大家自己慢慢研究吧。
本人初學PHP才幾天,發表內容非常淺顯,希望能給大家提供到幫助 O(∩_∩)O哈哈~