首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP json_encode 進階應用:中文處理、資料庫轉換與自定義編碼策略

     編輯:PHP 相關知識

json_encode 實戰進階:從資料庫到 API 的完整鏈路

承接基礎用法,本文聚焦中文 Unicode 轉義控制、資料庫結果集高效轉換、複雜巢狀結構處理、自定義遞歸編碼等進階場景。

資料庫結果集轉 JSON 最佳實踐(PDO)

function fetchUsersAsJson(PDO $pdo, int $limit = 20): string {
    $stmt = $pdo->prepare('SELECT id, username, email, created_at FROM users WHERE status = 1 ORDER BY id DESC LIMIT ?');
    $stmt->execute([$limit]);
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // 統一時間格式
    array_walk($rows, function (&$row) {
        $row['created_at'] = (new DateTime($row['created_at']))->format('c'); // ISO 8601
    });

    return json_encode([
        'code' => 0,
        'data' => ['list' => $rows],
        'meta' => ['count' => count($rows)]
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}

複雜巢狀結構輸出範例

$response = [
    'UserKeyGetResponse' => [
        'RequestName' => $apiRequestName,
        'api_key_value' => $apiKeyValue,
    ],
    'error_response' => [
        'code' => 'NO_ERROR',
        'msg' => '獲取系統參數成功',
    ],
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);

自定義遞歸編碼:統一字串清洗/脫敏

function jsonEncodeSafe(mixed $data, int $flags = 0, int $depth = 512): string|false {
    // 預處理:遞歸走訪字串
    array_walk_recursive($data, function (&$value, $key) {
        if (is_string($value)) {
            $value = trim($value);
            // 例:手機號脫敏
            if (stripos($key, 'phone') !== false || stripos($key, 'mobile') !== false) {
                $value = preg_replace('/^(\d{3})\d{4}(\d{4})$/', '$1****$2', $value);
            }
            // 例:移除 BOM
            $value = preg_replace('/^\xEF\xBB\xBF/', '', $value);
        }
    });
    return json_encode($data, $flags, $depth);
}

常見坑與解決

現象原因解決
中文變 \uXXXX未加 JSON_UNESCAPED_UNICODEPHP 5.4+ 加該旗標
返回 false / 空字串資料含非 UTF-8 字元mb_check_encoding / iconv 清洗
大整數精度丟失JS Number 53 位有效數字大整數以字串輸出,避免 JSON_NUMERIC_CHECK
循環引用錯誤物件屬性互相引用實作 JsonSerializable 控制輸出
深度過大錯誤巢狀超過 512 層調整 $depth 參數或扁平化結構

效能提示

  • 大量資料(>10 萬行)建議分批 json_encode 並流式輸出,避免記憶體飆升。
  • API 高併發場景可考慮 igbinary / msgpack 二進制序列化 + 前端解碼庫。
  • 啟用 OpCache 並預熱,減少編碼函數解析開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved