萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP json_encode / json_decode 完整指南:陣列轉 JSON、物件處理、中文編碼、格式化輸出

基本用法

$arr = [
    'a' => 'www.111cn.net',
    'b' => 'cc',
    'c' => 3,
    'd' => 4,
    'e' => 5
];

// 陣列 → JSON 字串
$json = json_encode($arr);
echo $json; // {"a":"www.111cn.net","b":"cc","c":3,"d":4,"e":5}

// JSON → PHP 變數(預設回傳物件)
$obj = json_decode($json);
var_dump($obj); // object(stdClass)#1 (5) { ["a"]=> string(14) "www.111cn.net" ... }

// JSON → 關聯陣列(第 2 參數 true)
$arr2 = json_decode($json, true);
var_dump($arr2); // array(5) { ["a"]=> string(14) "www.111cn.net" ... }

關鍵選項(第 2、3 參數)

實用範例

美化輸出 + 中文不轉義

$json = json_encode($arr, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
/*
{
    "a": "www.111cn.net",
    "b": "cc",
    "c": 3,
    "d": 4,
    "e": 5
}
*/

索引陣列 vs 關聯陣列輸出差異

echo json_encode(['a', 'b', 'c']);       // ["a","b","c"]  索引陣列 → JSON Array
echo json_encode(['id' => 'test']);      // {"id":"test"}  關聯陣列 → JSON Object
echo json_encode(['id' => 'test'], JSON_FORCE_OBJECT); // {"0":"test"} 強制物件

自訂 JSON 格式化函式(不依賴 JSON_PRETTY_PRINT)

function json_format(string $json): ?string {
    $tab = '  ';
    $new = '';
    $level = 0;
    $inStr = false;
    $len = strlen($json);

    for ($i = 0; $i < $len; $i++) {
        $char = $json[$i];
        switch ($char) {
            case '{': case '[':
                if (!$inStr) {
                    $new .= $char . "\n" . str_repeat($tab, ++$level);
                } else { $new .= $char; }
                break;
            case '}': case ']':
                if (!$inStr) {
                    $new .= "\n" . str_repeat($tab, --$level) . $char;
                } else { $new .= $char; }
                break;
            case ',':
                if (!$inStr) { $new .= ",\n" . str_repeat($tab, $level); }
                else { $new .= $char; }
                break;
            case ':':
                if (!$inStr) { $new .= ': '; }
                else { $new .= $char; }
                break;
            case '"':
                $inStr = !$inStr;
                $new .= $char;
                break;
            default:
                $new .= $char;
        }
    }
    return $new;
}

中文編碼陷阱與解決

  • PHP 5.4+:直接用 JSON_UNESCAPED_UNICODE
  • 舊版 PHP:先 urlencode() 再 json_encode(),前端 JS 用 decodeURIComponent() 還原
  • 資料庫/檔案儲存建議統一 UTF-8,避免 GBK/Big5 混雜導致 json_encode 回傳 false
  • 檢查錯誤:json_last_error()、json_last_error_msg()

原始來源:www.111cn.net

copyright © 萬盛學電腦網 all rights reserved
常數用途
JSON_PRETTY_PRINT美化縮排輸出(除錯用)
JSON_UNESCAPED_UNICODE**不轉義中文**,直接輸出可讀字元(PHP 5.4+)
JSON_UNESCAPED_SLASHES不轉義 / 號
JSON_NUMERIC_CHECK數字字串轉為數值型別
JSON_FORCE_OBJECT索引陣列強制輸出為物件