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

PHP json_encode() 完整指南:數據庫生成 JSON、中文處理、自定義遞歸編碼與常見坑點

     編輯:PHP 綜合知識

前言

json_encode() 是 PHP 生成 JSON 的核心函數。本文涵蓋基本用法、數據庫查詢生成 JSON、中文 Unicode 轉義處理、自定義遞歸編碼函數、常見坑點與最佳實踐。

基本用法

<?php
// 關聯陣列 → JSON 物件
echo json_encode(['a' => 'bbbb', 'c' => 'ddddd']);
// {"a":"bbbb","c":"ddddd"}

// 索引陣列 → JSON 陣列
echo json_encode(['apple', 'banana']);
// ["apple","banana"]

// 強制輸出物件(即使是索引陣列)
echo json_encode(['apple', 'banana'], JSON_FORCE_OBJECT);
// {"0":"apple","1":"banana"}

數據庫查詢生成 JSON 實戰

<?php
require 'Conn.php'; // 假設返回 $result 資源

// 單條記錄
$sql = "SELECT id, name FROM tbl_user WHERE id = 1";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
echo json_encode(['jsonObj' => $row]);
// {"jsonObj":{"id":"1","name":"lmw"}}

// 多條記錄
$sql = "SELECT id, name FROM tbl_user";
$result = mysql_query($sql);
$users = [];
while ($row = mysql_fetch_assoc($result)) {
    $users[] = $row;
}
echo json_encode(['dataList' => $users]);
// {"dataList":[{"id":"1","name":"lmw"},{"id":"2","name":"xxj"}]}

mysql_free_result($result);
mysql_close();

複雜嵌套結構構建

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

核心坑點:中文被轉為 Unicode 轉義序列

默認 json_encode 會將中文編碼為 \u4e2d\u6587,雖然標準 JSON 解析器均能正確解析,但調試困難、傳輸體積略大。

解決方案:JSON_UNESCAPED_UNICODE (PHP 5.4+)

echo json_encode($data, JSON_UNESCAPED_UNICODE);
// 直接輸出中文字符,可讀性強

舊版本兼容方案:自定義遞歸編碼

function arrayRecursive(&$array, $function, $apply_to_keys_also = false) {
    static $recursive_counter = 0;
    if (++$recursive_counter > 1000) {
        die('Possible deep recursion attack');
    }
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            arrayRecursive($array[$key], $function, $apply_to_keys_also);
        } else {
            $array[$key] = $function($value);
        }
        if ($apply_to_keys_also && is_string($key)) {
            $new_key = $function($key);
            if ($new_key != $key) {
                $array[$new_key] = $array[$key];
                unset($array[$key]);
            }
        }
    }
    $recursive_counter--;
}

// 使用:對所有值執行 urlencode,json_encode 後再 urldecode
arrayRecursive($data, 'urlencode', true);
$json = json_encode($data);
$json = urldecode($json);
echo $json; // 中文正常顯示

原理:urlencode 將中文轉為 %E4%B8%AD,json_encode 不轉義 %,最後 urldecode 還原。

常用選項常量

常量說明
JSON_HEX_TAG< > 轉為 \u003C \u003E,防 XSS
JSON_HEX_APOS單引號轉義
JSON_HEX_QUOT雙引號轉義
JSON_HEX_AMP& 轉義
JSON_UNESCAPED_UNICODE不轉義 Unicode 字符(中文可讀)
JSON_UNESCAPED_SLASHES不轉義 /
JSON_NUMERIC_CHECK數字字串轉為數字類型
JSON_PRETTY_PRINT格式化輸出(調試用)
JSON_PRESERVE_ZERO_FRACTION保留浮點數 .0
JSON_THROW_ON_ERROR編碼失敗拋異常 (PHP 7.3+)

組合推薦

$options = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP;
echo json_encode($data, $options);

常見錯誤與排查

現象原因解決
返回 false編碼失敗(如資源類型、遞歸引用)json_last_error_msg() 獲取具體錯誤
中文變 \uXXXX默認行為加 JSON_UNESCAPED_UNICODE
浮點數精度丟失JS 數字精度限制大數字用字串傳輸,或 JSON_PRESERVE_ZERO_FRACTION
資源類型編碼失敗不支援 resource先轉為陣列/物件

在線工具推薦

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved