自從PHP5.2開始的這個版本增加了對JSON的支援。主要包含兩個函數:json_encode和json_decode。
JSON是一種資料的儲存格式,就像PHP序列化後的字串一樣。也是一種資料描述,比如我們將一個數組序列化後存放,就可以很容易的還原序列化後應用。JSON也是如此,只不過他搭建的是用戶端Javascript和服務端PHP的互動橋樑。我們用PHP產生JSON後的字串,然後把這個字串傳給前台Javascript,Javascirpt就可以很容易的將其反JSON然後應用。
以下是舉例:
有檔案:brand1.json,內容如下,通過觀察就會發現JSON的格式很像數組:
[{"cName":"Intel","id":"1"},{"cName":"AMD","id":"2"}]
以下是PHP代碼:
<?php $content = file_get_contents("brand1.json"); $obj = json_decode($content); print_r($obj); echo "<hr>"; for($i = 0; $i < count($obj); $i ++){ echo "cName:".$obj[$i]->cName." id:".$obj[$i]->id."<br/>"; } ?>
以上代碼通過PHP的檔案操作讀取brand1.json檔案,讀取到的是brand1.json檔案中的字串內容,再通過第3行json_decode將此字串解碼,返回對象為數組對象。print_r($obj)列印的結果如下:
Array ( [0] => stdClass Object ( [cName] => Intel [id] => 1 ) [1] => stdClass Object ( [cName] => AMD [id] => 2 ) )
通過輸出的結果可以看出的確是數組,brand1.json中的兩個元素分別被產生為兩個stdClass Object對象放在數組中,在程式中輸出對象的值是通過調用對象的屬性來擷取,如:$obj[$i]->cName。還有一種情況,第3行代碼改為:$obj = json_decode($content,true); 可以將取出的JSON對象直接轉變成數組而不是stdClass Object對象,以下是第4行代碼輸出的結果:
Array ( [0] => Array ( [cName] => Intel [id] => 1 ) [1] => Array ( [cName] => AMD [id] => 2 ) )
和上圖對比,會發現儲存於數組中的不再是stdClass Object,而是Array。我們需要注意的是:在取出資料時就要換數組的方式來取值:$obj[$i]['cName'],而不能再用對象訪問屬性的方式來得到資料,如:$obj[$i]->cName,雖然不報錯,但你什麼都取不到。我們倒過來說,如果我們用了第一種方式解析資料,我們就只能用$obj[$i]->cName來訪問資料,如果換成$obj[$i]['cName'],那就會有錯誤資訊等著你了:
Fatal error: Cannot use object of type stdClass as array in D:/wamp/www/cj/data/test.php on line 8
錯誤資訊已經把問題描述得很清楚了,僅此而已,在不同的場合選擇合適的方式,沒有其他區別。