PHP Json模塊是PHP中常用的一個模塊,它可以將數組或對象轉化為JSON格式的字符串,也可以將JSON格式的字符串轉化為數組或對象。因為其方便的使用,廣泛地應用在PHP開發中。
PHP Json模塊提供的兩個方法,分別是json_encode()和json_decode()。使用 json_encode() 方法可以將PHP數組或對象轉化為JSON格式字符串,如下所示:
$person = array( 'name' =>'Tom', 'age' =>18, 'school' =>'XXX University', 'hobby' =>array('music', 'reading', 'sports') ); $json_str = json_encode($person); echo $json_str;
上面的代碼可以將一個關聯數組$person,通過json_encode()方法轉化為JSON格式字符串,并輸出到頁面上。
而使用json_decode()方法可以將JSON格式的字符串轉化為PHP數組或對象。:
$json_str = '{"name":"Tom","age":18,"school":"XXX University","hobby":["music","reading","sports"]}'; $person = json_decode($json_str); echo $person->name; echo $person->hobby[0];
上面的代碼將一個JSON格式的字符串$json_str,通過json_decode()方法轉化為一個PHP對象$person,可以通過對象的方式來訪問里面的屬性值。
PHP Json模塊除了上述常用的方法外,還提供了一些參數,可以設置JSON格式字符串的格式,比如縮進和小數位數等。其中 json_encode() 方法提供了兩個參數,分別是$option和$depth。$option 參數可以設置JSON格式字符串的格式,如下所示:
$person = array( 'name' =>'Tom', 'age' =>18, 'school' =>'XXX University' ); $json_str = json_encode($person, JSON_PRETTY_PRINT); echo $json_str;
上面的代碼輸出的JSON格式字符串會進行縮進,使其更易讀。
$depth 參數可以設置最大深度,以避免被惡意構造的JSON字符串導致程序崩潰。例如,下面的代碼會引發堆棧溢出的錯誤:
$person = array(); for ($i = 0; $i< 100000; $i++) { $person = array($person); } json_encode($person); // 報錯
我們可以通過如下方式,使用 $depth 參數避免產生這個問題:
$person = array(); for ($i = 0; $i< 100000; $i++) { $person = array($person); } json_encode($person, JSON_PARTIAL_OUTPUT_ON_ERROR, 512);
PHP Json模塊提供的 json_decode() 方法也可以使用參數來控制JSON字符串的處理方式。其中 $option 參數可以設置JSON字符串的解析方式,例如忽略空字節、大寫開頭的屬性、轉義斜杠等,如下所示:
$json_str = '{"Name":"Tom","Age":18,"Address":"New York","Hobby":["music","reading","sports"]}'; $person = json_decode($json_str, false, 512, JSON_BIGINT_AS_STRING|JSON_OBJECT_AS_ARRAY); print_r($person);
上面的代碼輸出的結果為:
Array ( [Name] =>Tom [Age] =>18 [Address] =>New York [Hobby] =>Array ( [0] =>music [1] =>reading [2] =>sports ) )
其中 JSON_BIGINT_AS_STRING 表示大整數的轉換方式,JSON_OBJECT_AS_ARRAY 表示對象的轉換方式。
PHP Json模塊也存在一些潛在的風險,可能會導致安全問題。例如,惡意的JSON字符串可能會包含對象的遞歸引用,導致程序進入死循環,造成資源的大量消耗。為了避免這個問題,我們可以使用 json_decode() 方法的 $depth 參數,設定最大遞歸層數來解決:
$json_str = '{"Name":"Tom","Age":18,"Address":"New York","Hobby":{"other":{"other":{"other":"football"}}}}'; $person = json_decode($json_str, false, 8, JSON_OBJECT_AS_ARRAY); print_r($person); // 報錯
上面的代碼設置了 $depth 參數的最大值為8,當遞歸層數超過8時,則會自動報錯。
綜上所述,PHP Json模塊作為常用的模塊,使用方便,但是需要注意安全問題和JSON字符串的格式問題。開發者可以根據使用需求,結合不同的參數,來達到最佳的效果。