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

PHP 處理 JSON 鍵值缺少雙引號的相容解析方案

     編輯:PHP 相關知識

解決 json_decode 失敗:鍵名未加雙引號的 JSON 字串相容處理

標準 JSON 規範要求鍵名必須用雙引號包裹({"name":"value"}),但實務上常遇到類 JavaScript 物件字面值格式({name:"value"}),導致 json_decode 回傳 NULL。本文提供正則預處理方案,相容解析此類非標準 JSON。

問題重現

<?php
$standard = '{"name":"fdipzone"}';
$nonStandard = '{name:"fdipzone"}';

var_dump(json_decode($standard, true));    // 正常解析
var_dump(json_decode($nonStandard, true)); // NULL
?>

解決方案:ext_json_decode()

<?php
/**
 * 相容鍵名無雙引號的 JSON 解析
 * @param string $str JSON 字串
 * @param bool $assoc true 回傳陣列,false 回傳物件
 * @return array|object|null
 */
function ext_json_decode($str, $assoc = false) {
    // 偵測是否有「單字:」模式(鍵名無引號)
    if (preg_match('/\w:/', $str)) {
        // 將 key: 替換為 "key":
        $str = preg_replace('/(\w+):/is', '"$1":', $str);
    }
    return json_decode($str, $assoc);
}

// 測試
$standard = '{"name":"fdipzone"}';
$nonStandard = '{name:"fdipzone"}';

var_dump(ext_json_decode($standard, true));    // 正常
var_dump(ext_json_decode($nonStandard, true)); // 也能正常解析!
?>

正則細節說明

  • /\w:/:偵測「單字字元後接冒號」,粗略判斷是否為無引號鍵名
  • /(\w+):/is:捕獲鍵名(字母數字底線),替換為 "$1":
  • i 忽略大小寫,s 讓 . 匹配換行(雖此處未用到)

限制與注意

不支援巢狀物件/陣列的複雜情況
若 JSON 結構複雜(巢狀、陣列中含物件),簡單正則可能誤替換字串值中的冒號。建議改用完整 JSON5 解析器(如 composer require colinodell/json5)。
數值鍵名
\w 不匹配純數字鍵名(如 {123:"val"}),若需支援請調整正則為 /([\w\d]+):/。
安全性
僅用於受信任來源資料,避免注入攻擊。

進階替代方案

// 使用 JSON5 解析器(支援註解、尾隨逗號、無引號鍵名等)
// composer require colinodell/json5
use ColinODell\Json5\Json5;
$data = Json5::decode('{name:"fdipzone", age: 25,}'); // 完美解析

相關技巧:JSON 值中含雙引號處理

$json = '{"desc":"He said \"Hello\""}';
// PHP 中字串本身需跳脫,json_decode 可正確處理標準 JSON
// 若為非標準且值含引號,建議先修正為標準 JSON 再解析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved