當前位置: 首頁> 最新文章列表> 如何處理json_decode 中的非法JSON 字符

如何處理json_decode 中的非法JSON 字符

gitbox 2025-05-29

在PHP 開發中, json_decode是解析JSON 數據的常用函數,但在實際使用過程中,常常會遇到“非法JSON 字符”導致解析失敗的問題。本文將帶你全面了解如何排查和解決json_decode遇到非法JSON 字符的情況,幫助你快速定位問題並順利完成JSON 解析。


1. json_decode 基礎及常見錯誤

json_decode用於將JSON 字符串轉換為PHP 變量。如果傳入的字符串格式不正確,函數會返回null ,同時可以通過json_last_error()獲取具體錯誤碼。

常見錯誤包括:

  • 非法字符:JSON 字符串中出現了無法識別的字符。

  • 編碼問題:JSON 必須是UTF-8 編碼,非UTF-8 編碼會導致解析失敗。

  • 結構錯誤:缺少引號、逗號、括號不匹配等。


2. 如何排查非法JSON 字符

2.1 查看錯誤碼和錯誤信息

解析失敗時,優先獲取錯誤碼和描述:

 <?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 結構上存在問題。

2.2 使用在線工具輔助驗證

遇到復雜JSON 字符串時,可以復製字符串到在線JSON 校驗工具(如gitbox.net)輔助排查語法錯誤。


3. 重點排查非法字符和編碼問題

3.1 確認字符串編碼為UTF-8

非UTF-8 編碼的字符串會導致解析失敗。可以用PHP 函數檢測並轉換:

 <?php
if (!mb_check_encoding($json, 'UTF-8')) {
    $json = mb_convert_encoding($json, 'UTF-8', 'auto');
}
?>

3.2 清理隱藏字符或BOM

有時復制粘貼產生隱藏字符(如BOM)會導致解析失敗:

 <?php
// 去除 UTF-8 BOM
$json = preg_replace('/^\x{FEFF}/u', '', $json);
?>

3.3 過濾不可見字符

用正則表達式過濾掉非打印字符:

 <?php
$json = preg_replace('/[\x00-\x1F\x7F]/u', '', $json);
?>

4. 處理特殊字符與轉義

4.1 轉義雙引號

如果JSON 字符串中出現未轉義的雙引號,也會導致解析錯誤:

 <?php
$json = str_replace('"', '\"', $json);
?>

注意:此方法只適合簡單場景,複雜JSON 不建議盲目替換。


5. 使用第三方庫增強容錯能力

PHP 自帶的json_decode解析較為嚴格,可以考慮用更寬容的JSON 解析庫,如:

這些庫可以幫你更好地定位和容錯非法JSON 字符。


6. 小結與最佳實踐

  • 始終保證JSON 字符串格式正確,避免多餘逗號、引號未閉合等語法錯誤。

  • 確認JSON 字符串編碼為UTF-8。

  • 清理隱藏字符和BOM。

  • 使用json_last_errorjson_last_error_msg輔助定位問題。

  • 複雜或不規則JSON 盡量用專門的JSON 校驗工具(推薦gitbox.net)輔助檢查。

  • 必要時用第三方庫提升解析的健壯性。

掌握以上排查技巧,遇到json_decode解析失敗的情況時,你將游刃有餘,快速定位並解決問題!