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

PHP 處理 JSON 格式資料完整實戰指南 (json_encode/json_decode 深度解析)

     編輯:PHP 綜合知識

JSON 簡介

JSON (JavaScript Object Notation) 是輕量級資料交換格式,易於人閱讀、機器解析。PHP 5.2+ 內建支援,核心函數:

  • json_encode():PHP 變數 → JSON 字串
  • json_decode():JSON 字串 → PHP 變數 (物件/陣列)

編碼注意事項

  • 必須 UTF-8:非 UTF-8 編碼 (如 GBK) 的中文會導致 json_encode 回傳 null 或空字串。解決:iconv('GBK', 'UTF-8', $str) 或 mb_convert_encoding()。
  • 資源型別不可編碼:資料庫連線、檔案句柄等資源型別會被忽略。
  • 循環引用會失敗:物件間循環引用觸發錯誤,需實作 JsonSerializable 介面控制輸出。

核心函數簽名

// 編碼
string json_encode(mixed $value, int $flags = 0, int $depth = 512)

// 解碼
mixed json_decode(string $json, bool $assoc = false, int $depth = 512, int $flags = 0)

常用 Flags:

常數說明
JSON_UNESCAPED_UNICODE不轉義 Unicode (中文直接顯示,PHP 5.4+)
JSON_UNESCAPED_SLASHES不轉義 / (PHP 5.4+)
JSON_PRETTY_PRINT美化縮進輸出 (PHP 5.4+)
JSON_NUMERIC_CHECK數字字串轉數值型別 (PHP 5.3.3+)
JSON_FORCE_OBJECT索引陣列強制輸出為物件

實戰案例集錦

案例 1:關聯陣列編碼 (標準物件)

$arr = [
    'name' => '魏艷輝',
    'nick' => '為夢翱翔',
    'contact' => [
        'email' => 'test@example.com',
        'website' => 'https://example.com'
    ]
];
$json = json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;
/*
{
    "name": "魏艷輝",
    "nick": "為夢翱翔",
    "contact": {
        "email": "test@example.com",
        "website": "https://example.com"
    }
}
*/

案例 2:解碼為物件 vs 陣列

$json = '{"id":1,"name":"test","tags":["a","b"]}';

// 預設解碼為 stdClass 物件
$obj = json_decode($json);
echo $obj->name;        // test
echo $obj->tags[0];     // a

// 第二參數 true 解碼為關聯陣列
$arr = json_decode($json, true);
echo $arr['name'];      // test
echo $arr['tags'][1];   // b

案例 3:前端 JavaScript 直接使用

<script>
// PHP 輸出的 JSON 直接賦值給 JS 變數
var data = {$json}; // 假設 PHP 已 echo json_encode($arr, JSON_UNESCAPED_UNICODE);
console.log(data.name); // 魏艷輝
console.log(data.contact.email); // test@example.com
</script>

關鍵:PHP 輸出時不加引號,前端直接當物件字面量使用。

案例 4:跨域 JSONP 回調

// profile.php (被調用端)
$arr = ['name' => '張三', 'age' => 25];
$json = json_encode($arr, JSON_UNESCAPED_UNICODE);
$callback = $_GET['callback'] ?? 'callback';
echo "{$callback}({$json});"; // 輸出: callback({"name":"張三","age":25});
// index.html (調用端)
<script>
function callback(data) {
    document.getElementById('name').innerText = data.name;
}
</script>
<div id="name"></div>
<script src="https://api.example.com/profile.php?callback=callback"></script>

案例 5:JS 端解析 JSON 字串 (AJAX 回應)

// 現代瀏覽器 (IE8+)
var obj = JSON.parse(jsonString);

// 相容舊瀏覽器 (不推薦 eval)
var obj = eval('(' + jsonString + ')'); // 安全風險:可能執行惡意代碼

案例 6-10:各類陣列/物件編碼對照表

PHP 結構json_encode 輸出JS 對應型別
物件 new StdClass{"id":1,"name":"test"}Object
索引陣列 [1, 'a', 'b'][1,"a","b"]Array
關聯陣列 ['id'=>1]{"id":1}Object
多維索引陣列 [[1,2],[3,4]][[1,2],[3,4]]Array of Array
多維關聯陣列 [['id'=>1],['id'=>2]][{"id":1},{"id":2}]Array of Object

規律:連續數字鍵 0..n-1 → JS Array,否則 → JS Object。

JSON 語法規範 (JS 端建構)

var jsonObj = {
    // 屬性名/值成對
    "property": "value",
    "number": 123,
    "bool": true,
    "null": null,
    "array": [1, 2, 3],
    "nested": { "key": "val" },
    // 函數屬性 (非標準 JSON,JS 物件才有)
    "method": function() { return this.property; }
};

標準 JSON 不支援函數、註解、尾隨逗號,嚴格遵循 RFC 8259。

常見問題與解決

問題原因解決
中文變 \uXXXX預設轉義 Unicode加 JSON_UNESCAPED_UNICODE (PHP 5.4+)
json_encode 回傳 false/null非 UTF-8、資源型別、循環引用json_last_error_msg() 診斷;轉編碼、移除資源、實作 JsonSerializable
大數字精度丟失JS Number 53 位精度限制傳字串 "id": "12345678901234567890",JS 用 BigInt 或字串處理
解碼深度超限巢狀超過 512 層調整 depth 參數或重構資料結構

進階:實作 JsonSerializable 介面 (PHP 5.4+)

class User implements JsonSerializable {
    private $id;
    private $name;
    private $password; // 敏感欄位不輸出
    
    public function __construct($id, $name, $pwd) {
        $this->id = $id;
        $this->name = $name;
        $this->password = $pwd;
    }
    
    public function jsonSerialize() {
        return [
            'id' => $this->id,
            'name' => $this->name,
            // password 自動排除
        ];
    }
}

$user = new User(1, 'admin', 'secret123');
echo json_encode($user, JSON_UNESCAPED_UNICODE);
// {"id":1,"name":"admin"}

總結

  • PHP ↔ JSON 互轉核心:json_encode() / json_decode()
  • 務必使用 UTF-8 編碼,配合 JSON_UNESCAPED_UNICODE 輸出可讀中文
  • 解碼預設得物件,加 true 得關聯陣列
  • 前端直接使用 PHP 輸出的 JSON 物件字面量,或 AJAX 回應用 JSON.parse()
  • 跨域用 JSONP (舊) 或 CORS (現代標準)
  • 複雜物件實作 JsonSerializable 精確控制輸出

掌握這些核心技巧,即可在 PHP 專案中高效、安全地處理 JSON 資料交換。

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