輕量級資料交換格式,語言無關,易讀寫、機器易解析。現代 Web API 實質標準。
json_encode($value, $flags, $depth):PHP 變數 → JSON 字串json_decode($json, $assoc, $depth, $options):JSON 字串 → PHP 變數($assoc=true 回傳關聯陣列)<?php
$arr = [
'name' => '劉璐',
'nick' => '璐小璐',
'age' => 26,
'contact' => [
'phone' => '13718136109',
'address' => 'Beijing ifdoo'
]
];
$json = json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;
// 輸出:
// {
// "name": "劉璐",
// "nick": "璐小璐",
// "age": "26",
// "contact": {
// "phone": "13718136109",
// "address": "Beijing ifdoo"
// }
// }
?>
<script>
var data = {"name":"劉璐","nick":"璐小璐","age":"26",...};
console.log(data.name); // 劉璐
// AJAX 取得後直接作為物件使用
fetch('/api/profile').then(r => r.json()).then(data => {
document.getElementById('nick').textContent = data.nick;
});
</script>
<?php
// profile.php
$json = json_encode($arr);
echo "getProfile($json);"; // 輸出可執行 JS
?>
<!-- index.html -->
<script src="./profile.php"></script>
<script>
function getProfile(data) { console.log(data.nick); }
</script>
PHP 專有格式,保留型別、結構、物件類別資訊。適合 PHP 內部儲存(Session、快取、資料庫 Blob 欄位)。
serialize($value):變數 → 可儲存字串unserialize($str):字串 → 還原變數<?php
$arr = [
"u1" => ["gameName" => "德乙", "homeName" => "比勒費爾德"],
"u2" => ["gameName" => "英超", "homeName" => "水晶宮"]
];
echo serialize($arr);
// 輸出:
// a:2:{
// s:2:"u1";a:2:{s:8:"gameName";s:6:"德乙";s:8:"homeName";s:15:"比勒費爾德";}
// s:2:"u2";a:2:{s:8:"gameName";s:6:"英超";s:8:"homeName";s:9:"水晶宮";}
// }
// 格式:a=陣列, s=字串, i=整數, d=浮點, b=布林, O=物件, N=null
| 維度 | JSON | serialize |
|---|---|---|
| 跨語言支援 | ✅ 完美 | ❌ 僅 PHP |
| 資料型別保真 | ⚠️ 無整數/浮點/布林區分(皆為字串/數字) | ✅ 完整保留 |
| 物件支援 | ⚠️ 僅 public 屬性,需實作 JsonSerializable | ✅ 含 private/protected、類別名 |
| 安全性 | ✅ 安全(純資料) | ⚠️ 反序列化可觸發魔術方法(__wakeup 等),需謹慎 |
| 可讀性 | ✅ 高 | ❌ 低 |
| 體積 | 較小 | 較大(含型別標記) |
| 效能 | 快(C 層優化) | 較慢 |
igbinary、msgpack、protobuf 提供更高效能與型別保真絕對不要 unserialize() 來自不可信來源的資料(用戶輸入、外部 API、Cookie),可能導致物件注入攻擊(POP 鏈)。JSON 無此風險。