後端返回 JSON 格式字符串 '{"total":2,"list":[{"id":1}]}',前端 array.push(str) 導致數組元素為字符串而非對象,無法直接訪問屬性。
const jsonStr = '{"total":2,"list":[{"id":1,"t":"1026px","top":"308px;"}]}';
let arr = [];
try {
const obj = JSON.parse(jsonStr); // 解析為 JS 對象
arr.push(obj); // 推入對象,而非字符串
console.log(arr[0].total); // 2
console.log(arr[0].list[0].id); // 1
} catch (e) {
console.error('JSON 解析失敗:', e);
}
// 僅在受信環境、舊瀏覽器兼容時使用
const obj = eval('(' + jsonStr + ')'); // 括號強制表達式上下文
arr.push(obj);
| 特性 | JSON.parse | eval |
|---|---|---|
| 執行任意代碼 | 否 | 是(極高風險) |
| 解析速度 | 快(原生優化) | 慢(編譯器介入) |
| 語法嚴格性 | 標準 JSON | 寬鬆 JS 語法 |
| CSP 兼容 | 是 | 常被禁止 |
// 錯誤 1:單引號包裹雙引號 JSON
const bad = "{'a':1}"; // JSON 要求雙引號
// 修正:後端輸出標準 JSON,或前端 replace(/'/g, '"') 有風險
// 錯誤 2:尾隨逗號
const bad = '{"a":1,}'; // JSON 不允許
// 修正:後端修正序列化
// 錯誤 3:undefined/函數/Date 等非 JSON 類型
const bad = '{"fn": function(){}}';
// 修正:轉為字符串或時間戳
超大 JSON (>10MB) 考慮 oboe.js、JSONStream 流式解析,避免阻塞主線程。
拒絕 eval,擁抱 JSON.parse,構建安全穩健的前端應用。