基本用法
$json = '{"id":1,"name":"jb51","email":"admin@jb51.net","interest":["wordpress","php"]}';
// 解析為物件 (預設)
$obj = json_decode($json);
echo $obj->name; // jb51
echo $obj->interest[1]; // php
// 解析為關聯陣列
$arr = json_decode($json, true);
echo $arr['name']; // jb51
echo $arr['interest'][1]; // php
錯誤處理
$data = json_decode($input, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('JSON 解析失敗: ' . json_last_error_msg());
}
// PHP 7.3+ 可用 JSON_THROW_ON_ERROR
$data = json_decode($input, true, 512, JSON_THROW_ON_ERROR);
深度限制與大數據
- 預設最大深度 512,可調整第 3 參數。
- 超大 JSON (>100MB) 會耗盡記憶體,建議流式解析。
流式解析:JsonMachine / halaxa/json-machine
// composer require halaxa/json-machine
use JsonMachine\JsonMachine;
$items = JsonMachine::fromFile('huge.json'); // 生成器,逐項迭代
foreach ($items as $key => $item) {
// 處理單個項目,記憶體常數級
process($item);
}
編碼選項 (json_encode)
$data = ['name' => '中文', 'url' => 'https://example.com/?a=1&b=2'];
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
// 輸出:
// {
// "name": "中文",
// "url": "https://example.com/?a=1&b=2"
// }
常用選項表
| 常數 | 作用 |
JSON_UNESCAPED_UNICODE | 不轉義 Unicode(中文可讀) |
JSON_UNESCAPED_SLASHES | 不轉義 / |
JSON_PRETTY_PRINT | 美化縮排 |
JSON_NUMERIC_CHECK | 數字字符串轉數值 |
JSON_PRESERVE_ZERO_FRACTION | 保留 .0 (1.0 不變 1) |
JSON_THROW_ON_ERROR | 錯誤拋出異常 (PHP 7.3+) |
效能提示
json_encode/decode 為 C 擴展,速度極快;大陣列優於 serialize。
- 頻繁編解碼同結構數據,考慮
igbinary 或 msgpack 擴展(更快、更小)。
- 避免在循環中重複編碼同一數據;預先編碼緩存。