輕量、原生支援 JavaScript 物件語法、解析速度快、無需複雜 XML 解析器,是 AJAX 時代最佳資料交換格式。
json_encode($value, $flags = 0, $depth = 512):PHP 變數 → JSON 字串。json_decode($json, $assoc = false, $depth = 512, $options = 0):JSON 字串 → PHP 物件(預設)或關聯陣列($assoc=true)。<?php
$arr = [
'name' => '陳毅鑫',
'nick' => '深空',
'contact' => [
'email' => 'shenkong at qq dot com',
'website' => 'https://www.chenyixin.com'
]
];
$json = json_encode($arr, JSON_UNESCAPED_UNICODE);
echo $json;
// {"name":"陳毅鑫","nick":"深空","contact":{"email":"shenkong at qq dot com","website":"https://www.chenyixin.com"}}
?>
$obj = json_decode($json); // stdClass 物件
echo $obj->name; // 陳毅鑫
$arr = json_decode($json, true); // 關聯陣列
echo $arr['contact']['email'];
若 PHP 檔案/資料庫為 GBK,中文會編碼為 null。解決:iconv('GBK', 'UTF-8', $str) 或全站統一 UTF-8。
<script>
var data = ; // 直接賦值成 JS 物件
console.log(data.nick); // 深空
// 或 AJAX 取得
fetch('api.php').then(r => r.json()).then(data => { ... });
</script>
原理:後端輸出 callbackName(jsonData),前端動態建立 <script src="api.php?callback=fn">。
<?php
// profile.php
$arr = ['name' => '陳毅鑫', 'nick' => '深空'];
echo $_GET['callback'] . '(' . json_encode($arr, JSON_UNESCAPED_UNICODE) . ')';
?>
// index.html
function getProfile(data) { document.getElementById('nick').textContent = data.nick; }
<script src="profile.php?callback=getProfile"></script>
注意:JSONP 僅支援 GET,有安全風險(CSRF/XSS),現代專案首選 CORS(Access-Control-Allow-Origin)。