核心函數
json_encode($value, $flags = 0, $depth = 512):將 PHP 變數編碼為 JSON 字串。
json_decode($json, $assoc = false, $depth = 512, $options = 0):解碼 JSON 字串,`$assoc=true` 回傳關聯陣列,否則回傳 `stdClass` 物件。
json_last_error() / json_last_error_msg():檢查最近一次編碼/解碼錯誤。
基本範例
<?php
$books = [
'key1' => 'value1',
'key2' => 'value2',
'key3' => ['key4' => 'value4', 'key5' => 'value5']
];
$json = json_encode($books, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo "編碼後:\n$json\n\n";
$decoded = json_decode($json, true);
echo "解碼後(關聯陣列):\n";
print_r($decoded);
?>
常用旗標
| 旗標 | 說明 |
| JSON_HEX_TAG | 將 `<` `>` 轉為 `\u003C` `\u003E` |
| JSON_HEX_APOS | 將 `'` 轉為 `\u0027` |
| JSON_HEX_QUOT | 將 `"` 轉為 `\u0022` |
| JSON_HEX_AMP | 將 `&` 轉為 `\u0026` |
| JSON_UNESCAPED_UNICODE | 不將 Unicode 字元轉義(中文直接顯示) |
| JSON_UNESCAPED_SLASHES | 不轉義 `/` |
| JSON_PRETTY_PRINT | 格式化縮排輸出 |
| JSON_NUMERIC_CHECK | 將數字字串轉為數值型別 |
| JSON_PRESERVE_ZERO_FRACTION | 保留浮點數的 `.0` |
實務範例:API 回應
<?php
header('Content-Type: application/json; charset=utf-8');
$data = [
'error_code' => 0,
'message' => '成功',
'data' => [
['id' => 1, 'name' => '產品A', 'price' => 199.00],
['id' => 2, 'name' => '產品B', 'price' => 299.50]
]
];
// 錯誤處理
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
if ($json === false) {
http_response_code(500);
echo json_encode(['error_code' => 500, 'message' => 'JSON 編碼失敗: ' . json_last_error_msg()]);
exit;
}
echo $json;
?>
解碼 Unicode 逸出字串
<?php
$jsonStr = '{"error":"\\u4f20\\u5165\\u7684\\u53c3\\u6578\\u9519\\u8aa4"}';
$obj = json_decode($jsonStr);
echo $obj->error; // 輸入的參數錯誤
?>
錯誤處理最佳實踐
<?php
function safeJsonDecode($json, $assoc = true) {
$result = json_decode($json, $assoc);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('JSON 解碼失敗: ' . json_last_error_msg());
}
return $result;
}
?>