首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 判斷字串是否為合法 JSON 格式的最佳實踐

     編輯:PHP 相關知識

前言

API 開發中頻繁需要驗證輸入字串是否為合法 JSON。PHP 5.3+ 提供 json_last_error() 精確判斷解碼錯誤類型,配合 json_decode() 可建立可靠的檢測函數。本文提供多種版本檢測函數、常見陷阱與編碼注意事項。

核心原理

  • json_decode() 解碼失敗回傳 null,但合法 JSON null 也回傳 null,單靠回傳值無法區分。
  • json_last_error() 回傳最後一次解碼錯誤代碼,JSON_ERROR_NONE 表示無錯誤。
  • 輸入字串**必須為 UTF-8 編碼**,否則解碼失敗或產生錯誤字符。

推薦檢測函數(PHP 5.3+)

function is_json($string) {
    json_decode($string);
    return json_last_error() === JSON_ERROR_NONE;
}

舊版 PHP 相容寫法(PHP 5.2)

function is_not_json($str) {
    return is_null(json_decode($str));
}
// 僅能粗略判斷,無法區分「合法 null」與「解碼失敗」

json_last_error() 常見錯誤代碼對照表

進階解析函數:提取 JSON 片段並解碼

function analyJson($json_str) {
    // 移除雙反斜線(常見於雙重編碼)
    $json_str = str_replace('\\\\', '', $json_str);
    // 以正則提取第一個 { ... } 區塊
    $out_arr = array();
    if (preg_match('/\{.*\}/s', $json_str, $out_arr)) {
        return json_decode($out_arr[0], true);  // 關聯陣列模式
    }
    return false;
}

編碼陷阱與解決方案

常數數值說明
JSON_ERROR_NONE0無錯誤
JSON_ERROR_DEPTH1堆疊深度超過限制
JSON_ERROR_STATE_MISMATCH2語法錯誤(如缺逗號、括號不匹配)
JSON_ERROR_CTRL_CHAR3控制字元錯誤
JSON_ERROR_SYNTAX4語法錯誤
JSON_ERROR_UTF85非法 UTF-8 字元(常見於編碼不匹配)
問題原因解決
中文變亂碼/空字串來源字串非 UTF-8iconv('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,必要時先轉碼。進階場景可結合正則提取片段再解碼,提升容錯能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved