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

JSON 鍵名為數字時的正確訪問方式:PHP 與 JavaScript 跨語言示例

     編輯:PHP 相關知識

JSON 規範允許鍵名為字符串,但數字鍵名在編碼為 JSON 字符串時會被轉為字符串。在 PHP 和 JavaScript 中訪問此類鍵,**必須使用方括號語法(陣列/對象屬性訪問)**,不能使用點號語法。

PHP 端:json_encode 自動轉換數字鍵

 ["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,不存在。

JavaScript 端:對象屬性訪問規則

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
  • JS 對象屬性名本質是字符串,數字鍵會被隱式調用 ToString()。
  • obj[90] 和 obj['90'] 等效,但語義上建議用字符串。
  • 包含特殊字符(空格、連字符、$ 等)的鍵,**只能用方括號+字符串**訪問。

PHP 生成 JS 代碼時的注意事項

 'value', 'status' => 'ok']);
// 輸出到 JS 變量
echo "";
// 生成: var data = {"90":"value","status":"ok"};

直接輸出 $json 到 JS 代碼中(無單引號),JS 引擎直接解析為對象字面量,鍵名保持字符串形式。

最佳實踐建議

  1. 設計階段避免數字鍵:改用語義化字符串鍵(如 "item_90"、"queue_90"),提升可讀性,避免跨語言訪問陷阱。
  2. 統一使用方括號訪問:無論鍵名類型,統一採用 obj['key'] / $arr['key'],消除點號語法限制差異。
  3. PHP 解碼強制關聯陣列:始終使用 json_decode($json, true),避免 stdClass 對象屬性訪問的數字鍵限制($obj->90 語法錯誤)。
  4. API 文檔標註鍵類型:明確標註字符串鍵,前後端協作時減少誤解。

總結

語言數字鍵編碼後類型正確訪問語法錯誤語法
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"。

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