JSON 規範允許鍵名為字符串,但數字鍵名在編碼為 JSON 字符串時會被轉為字符串。在 PHP 和 JavaScript 中訪問此類鍵,**必須使用方括號語法(陣列/對象屬性訪問)**,不能使用點號語法。
["90" => "90隊列", "status" => "成功"]];
$json = json_encode($array);
// 輸出: {"result":{"90":"90\u968a\u5217","status":"\u6210\u529f"}}
// 解碼為關聯陣列 (第2參數 true)
$phpArray = json_decode($json, true);
// ✅ 正確訪問:方括號 + 字符串鍵
echo $phpArray['result']['90']; // 輸出: 90隊列
// ❌ 錯誤訪問:點號或數字索引
// $phpArray['result'][90]; // Notice: Undefined offset 90
// $phpArray->result->90; // 語法錯誤
json_encode 將數字鍵 90 編碼為字符串 "90"。json_decode($json, true) 返回關聯陣列,鍵為字符串 "90"。$arr['90'] 訪問,$arr[90] 會尋找整數鍵 90,不存在。var data = {"result":{"90":"90隊列","status":"成功"}};
// ✅ 正確:方括號 + 字符串/數字(JS 自動轉換)
console.log(data.result['90']); // "90隊列"
console.log(data.result[90]); // "90隊列" (JS 隱式轉換)
// ✅ 正確:非數字鍵可用點號
console.log(data.result.status); // "成功"
console.log(data.result['status']); // "成功"
// ❌ 錯誤:數字鍵不能用點號
// console.log(data.result.90); // SyntaxError
ToString()。obj[90] 和 obj['90'] 等效,但語義上建議用字符串。 'value', 'status' => 'ok']);
// 輸出到 JS 變量
echo "";
// 生成: var data = {"90":"value","status":"ok"};
直接輸出 $json 到 JS 代碼中(無單引號),JS 引擎直接解析為對象字面量,鍵名保持字符串形式。
"item_90"、"queue_90"),提升可讀性,避免跨語言訪問陷阱。obj['key'] / $arr['key'],消除點號語法限制差異。json_decode($json, true),避免 stdClass 對象屬性訪問的數字鍵限制($obj->90 語法錯誤)。| 語言 | 數字鍵編碼後類型 | 正確訪問語法 | 錯誤語法 |
|---|---|---|---|
| PHP (json_decode true) | 字符串 "90" | $arr['90'] | $arr[90], $obj->90 |
| PHP (json_decode false) | 字符串 "90" | $obj->{'90'} | $obj->90 |
| JavaScript | 字符串 "90" | obj['90'], obj[90] | obj.90 |
記住:**JSON 鍵名本質全是字符串,方括號語法通吃,點號語法有限制**。統一規範,杜絕 "Undefined offset" 與 "SyntaxError"。