後台返回格式 [['和平區',129],['皇姑區',62]],**非標準 JSON**(標準應為 [["和平區",129],["皇姑區",62]] 或對象數組)。JSP <%= %> 輸出時中括號被解析丟失,Ajax 無法直接 JSON.parse。
後台拼接字符串時未按 JSON 標準序列化(單引號、無雙引號包裹鍵/字符串值)。
// Controller / Servlet
List> data = new ArrayList<>();
data.add(Arrays.asList("和平區", 129));
data.add(Arrays.asList("皇姑區", 62));
// Jackson
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(data);
// 结果: [["和平區",129],["皇姑區",62]]
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(json);
$.getJSON('/api/areas', function(arr) {
// arr 為陣列: [["和平區",129], ["皇姑區",62]]
arr.forEach(item => {
console.log(item[0], item[1]); // 名稱、值
$('#sel').append(``);
});
});
// 原始響應文本: "[['和平區',129],['皇姑區',62]]"
let raw = responseText
.replace(/'/g, '"') // 單引號 → 雙引號
.replace(/(\w+):/g, '"$1":'); // 鍵加雙引號(若有鍵)
// 現在為標準 JSON,可 JSON.parse
let data = JSON.parse(raw);
| 方案 | 優點 | 缺點 | 適用 |
|---|---|---|---|
| 後台序列化標準 JSON | 前端零成本、類型安全、可緩存、符合規範 | 需引入庫、改動後台 | 所有新項目/可改後台 |
| 前端字符串修正 | 不動後台、快速兼容舊接口 | 脆弱、易因格式變動報錯、性能損耗 | 無法改後台的維護期 |
application/json;charset=UTF-8,避免瀏覽器誤判。{"code":0,"msg":"ok","data":[]},前端統一攔截處理。核心觀點:**別在前端寫字符串處理邏輯去修補後台的非標準輸出**,源頭修正才是正道。