1. 程式人生 > >PHP 生成複雜JSON格式 簡單快速方法

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_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);

至於其他常量都是做什麼用的,大家自己慢慢研究吧。

本人初學PHP才幾天,發表內容非常淺顯,希望能給大家提供到幫助 O(∩_∩)O哈哈~