在PHP 開發中, json_decode是解析JSON 數據的常用函數,但在實際使用過程中,常常會遇到“非法JSON 字符”導致解析失敗的問題。本文將帶你全面了解如何排查和解決json_decode遇到非法JSON 字符的情況,幫助你快速定位問題並順利完成JSON 解析。
json_decode用於將JSON 字符串轉換為PHP 變量。如果傳入的字符串格式不正確,函數會返回null ,同時可以通過json_last_error()獲取具體錯誤碼。
常見錯誤包括:
非法字符:JSON 字符串中出現了無法識別的字符。
編碼問題:JSON 必須是UTF-8 編碼,非UTF-8 編碼會導致解析失敗。
結構錯誤:缺少引號、逗號、括號不匹配等。
解析失敗時,優先獲取錯誤碼和描述:
<?php
$json = '{"name": "張三", "age": 28,}'; // 注意結尾多了個逗號
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo '錯誤碼:' . json_last_error() . PHP_EOL;
echo '錯誤訊息:' . json_last_error_msg() . PHP_EOL;
}
?>
這段代碼會提示“語法錯誤”,告訴你JSON 結構上存在問題。
遇到復雜JSON 字符串時,可以復製字符串到在線JSON 校驗工具(如gitbox.net)輔助排查語法錯誤。
非UTF-8 編碼的字符串會導致解析失敗。可以用PHP 函數檢測並轉換:
<?php
if (!mb_check_encoding($json, 'UTF-8')) {
$json = mb_convert_encoding($json, 'UTF-8', 'auto');
}
?>
有時復制粘貼產生隱藏字符(如BOM)會導致解析失敗:
<?php
// 去除 UTF-8 BOM
$json = preg_replace('/^\x{FEFF}/u', '', $json);
?>
用正則表達式過濾掉非打印字符:
<?php
$json = preg_replace('/[\x00-\x1F\x7F]/u', '', $json);
?>
如果JSON 字符串中出現未轉義的雙引號,也會導致解析錯誤:
<?php
$json = str_replace('"', '\"', $json);
?>
注意:此方法只適合簡單場景,複雜JSON 不建議盲目替換。
PHP 自帶的json_decode解析較為嚴格,可以考慮用更寬容的JSON 解析庫,如:
這些庫可以幫你更好地定位和容錯非法JSON 字符。
始終保證JSON 字符串格式正確,避免多餘逗號、引號未閉合等語法錯誤。
確認JSON 字符串編碼為UTF-8。
清理隱藏字符和BOM。
使用json_last_error和json_last_error_msg輔助定位問題。
複雜或不規則JSON 盡量用專門的JSON 校驗工具(推薦gitbox.net)輔助檢查。
必要時用第三方庫提升解析的健壯性。
掌握以上排查技巧,遇到json_decode解析失敗的情況時,你將游刃有餘,快速定位並解決問題!