API 開發中頻繁需要驗證輸入字串是否為合法 JSON。PHP 5.3+ 提供 json_last_error() 精確判斷解碼錯誤類型,配合 json_decode() 可建立可靠的檢測函數。本文提供多種版本檢測函數、常見陷阱與編碼注意事項。
json_decode() 解碼失敗回傳 null,但合法 JSON null 也回傳 null,單靠回傳值無法區分。json_last_error() 回傳最後一次解碼錯誤代碼,JSON_ERROR_NONE 表示無錯誤。function is_json($string) {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
function is_not_json($str) {
return is_null(json_decode($str));
}
// 僅能粗略判斷,無法區分「合法 null」與「解碼失敗」
| 常數 | 數值 | 說明 |
|---|---|---|
| JSON_ERROR_NONE | 0 | 無錯誤 |
| JSON_ERROR_DEPTH | 1 | 堆疊深度超過限制 |
| JSON_ERROR_STATE_MISMATCH | 2 | 語法錯誤(如缺逗號、括號不匹配) |
| JSON_ERROR_CTRL_CHAR | 3 | 控制字元錯誤 |
| JSON_ERROR_SYNTAX | 4 | 語法錯誤 |
| JSON_ERROR_UTF8 | 5 | 非法 UTF-8 字元(常見於編碼不匹配) |
| 問題 | 原因 | 解決 |
|---|---|---|
| 中文變亂碼/空字串 | 來源字串非 UTF-8 | iconv('GBK', 'UTF-8', $str) 或 mb_convert_encoding() |
| json_encode 中文成 \uXXXX | 預設選項 | PHP 5.4+ 加 JSON_UNESCAPED_UNICODE |
| 大數字精度遺失 | JS 數字精度限制 | 傳字串或用 json_encode($data, JSON_PRESERVE_ZERO_FRACTION) |
判斷 JSON 合法性:**PHP 5.3+ 必用 json_last_error() === JSON_ERROR_NONE**,嚴謹可靠。務必確認輸入為 UTF-8,必要時先轉碼。進階場景可結合正則提取片段再解碼,提升容錯能力。