json_decode函數的基本格式如下:
$data = json_decode($jsonString, true);
第一個參數是JSON 字符串。
第二個參數為true時,結果會被解析成關聯數組;如果省略或為false ,則返回對象。
假設我們有如下的多維JSON 數據:
{
"user": {
"name": "Alice",
"contacts": [
{"type": "email", "value": "[email protected]"},
{"type": "phone", "value": "123456789"}
]
}
}
解析代碼:
$json = '{"user":{"name":"Alice","contacts":[{"type":"email","value":"[email protected]"},{"type":"phone","value":"123456789"}]}}';
$data = json_decode($json, true);
此時, $data是一個多維關聯數組。許多開發者遇到的問題是:
未正確判斷JSON 是否解析成功<br> 如果傳入的JSON 格式有誤, json_decode會返回nul l ,而且不會報錯需要用json_last_error()來判斷。
混淆對象與數組訪問方式<br>當json_decode第二個參數為fals e (默認),返回的是對象,需要用->訪問屬性;若為tru e ,返回數組,需要用[]訪問
未考慮多維數組的層級訪問<br> 對多維數組訪問時,寫成$data['user']->name會導致錯誤,因為$data['user']是數組而不是對象
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 解析錯誤:" . json_last_error_msg();
exit;
}
這一步能有效避免後續處理錯誤。
// 錯誤示範(第二個參數為true,結果為數組,不能用 ->)
echo $data['user']->name; // 會報錯
// 正確示範
echo $data['user']['name']; // 輸出 Alice
假設我們想遍歷contacts :
foreach ($data['user']['contacts'] as $contact) {
echo $contact['type'] . ": " . $contact['value'] . "\n";
}
對於結構複雜且層數不固定的JSON,可能需要遞歸解析。示例:
function printJson($data, $indent = 0) {
if (is_array($data)) {
foreach ($data as $key => $value) {
echo str_repeat(" ", $indent) . $key . ": ";
if (is_array($value)) {
echo "\n";
printJson($value, $indent + 1);
} else {
echo $value . "\n";
}
}
}
}
printJson($data);
這段代碼可以清晰打印多維數組的所有層級和鍵值。
使用json_decode解析多維JSON 時,務必檢查解析是否成功,使用json_last_error() 。
明確傳入的第二參數,決定返回對像還是數組,訪問方式要一致。
對多維數組或對象,準確訪問層級,避免混用->和[] 。
需要時使用遞歸函數處理複雜多維結構。
只要掌握以上要點,就能有效避免json_decode解析多維JSON 數據時的常見陷阱,寫出更健壯、可維護的PHP 代碼。