本文匯總 json_encode 核心用法、資料庫結果集轉換、中文 Unicode 處理、自定義遞歸編碼、錯誤碼規範等生產級技巧。
echo json_encode(['a' => 'bbbb', 'c' => 'ddddd']);
// {"a":"bbbb","c":"ddddd"}
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$stmt = $pdo->query('SELECT id, name FROM users LIMIT 10');
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'code' => 0,
'msg' => 'success',
'data' => ['list' => $rows]
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$respon = [
'UserKeyGetResponse' => [
'RequestName' => $api_request_name,
'api_key_value' => $api_key_value,
],
'error_response' => [
'code' => 'NO_ERROR',
'msg' => '獲取系統參數成功',
],
];
echo json_encode($respon, JSON_UNESCAPED_UNICODE);
function jsonEncodeDeep(mixed $data, int $flags = 0): string|false {
array_walk_recursive($data, function (&$value, $key) {
if (is_string($value)) {
$value = trim($value);
// 手機號脫敏
if (in_array($key, ['phone', 'mobile', 'tel'])) {
$value = preg_replace('/^(\d{3})\d{4}(\d{4})$/', '$1****$2', $value);
}
}
});
return json_encode($data, $flags);
}
// jQuery
$.getJSON('/api/users', res => {
if (res.code === 0) {
$.each(res.data.list, (i, user) => console.log(user.name));
}
});
// Fetch
const res = await fetch('/api/users');
const { code, data } = await res.json();
| 問題 | 解決 |
|---|---|
| 中文變 \uXXXX | 加 JSON_UNESCAPED_UNICODE (PHP 5.4+) |
| 返回 false | 檢查非 UTF-8 字元,用 mb_check_encoding 清洗 |
| 大整數精度丟失 | 避免 JSON_NUMERIC_CHECK,大整數以字串輸出 |
| 循環引用 | 實作 JsonSerializable 控制輸出 |