自 PHP 5.2 起內建 json_encode() 與 json_decode(),本文詳細說明編碼、解碼、陣列與物件轉換、類別序列化、常見錯誤與最佳實踐。
將陣列或物件轉為 JSON 字串:
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
echo json_encode($arr); // {"a":1,"b":2,"c":3}
$obj->body = 'another post';
$obj->id = 21;
echo json_encode($obj);
重要:輸入必須為 UTF-8 編碼,否則中文會變成 null 或空字串。
JS 不支援關聯陣列,因此:
[]{}$indexed = ['one', 'two', 'three'];
echo json_encode($indexed); // ["one","two","three"]
$assoc = ['1' => 'one', '2' => 'two'];
echo json_encode($assoc); // {"1":"one","2":"two"}
強制索引陣列輸出為物件:
json_encode((object)$arr);
// 或
json_encode($arr, JSON_FORCE_OBJECT);
只有 public 屬性會被編碼,常數、私有/受保護屬性、方法皆會忽略:
class Foo {
const ERROR_CODE = '404';
public $public_ex = 'public';
private $private_ex = 'private';
protected $protected_ex = 'protected';
}
$foo = new Foo;
echo json_encode($foo); // {"public_ex":"public"}
預設回傳 stdClass 物件,加 true 參數可得關聯陣列:
$json = '{"a":1,"b":2}';
$obj = json_decode($json);
echo $obj->a; // 1
$arr = json_decode($json, true);
echo $arr['a']; // 1
以下三種寫法皆會導致 json_decode() 回傳 null:
{ 'bar': 'baz' }{ bar: "baz" }{ "bar": "baz", }JSON 規範要求:鍵名與字串值必須用雙引號,最後一個值後不可有逗號。
| 旗標 | 說明 |
|---|---|
| JSON_HEX_TAG | 將 < > 轉為 \u003C \u003E |
| JSON_HEX_APOS | 將單引號轉為 \u0027 |
| JSON_HEX_QUOT | 將雙引號轉為 \u0022 |
| JSON_HEX_AMP | 將 & 轉為 \u0026 |
| JSON_UNESCAPED_UNICODE | 不轉義 Unicode 字元(直接輸出中文),PHP 5.4+ |
| JSON_UNESCAPED_SLASHES | 不轉義正斜線 / |
| JSON_PRETTY_PRINT | 美化輸出(縮排換行) |
// 範例:輸出可讀且保留中文的 JSON
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);