jQuery `$.ajax` 設置 `dataType: 'json'` 時,會自動將響應體解析為 JavaScript 對象/數組,**無需手動 `JSON.parse()`**。
// Java 後端
class A { List bList; }
class B { List cList; }
class C { String name; int value; }
List listA = ...;
return listA; // Jackson 序列化為 JSON 數組
$.ajax({
url: '/api/data',
type: 'GET',
dataType: 'json', // 關鍵:自動解析
success: function(data) {
// data 已是 JavaScript 對象/數組
console.log(typeof data); // "object" (實為 Array)
processData(data);
},
error: function(xhr, status, error) {
console.error('請求失敗:', status, error);
}
});
function processData(listA) {
var html = '';
$.each(listA, function(i, a) { // 遍歷 A 數組
html += '<div class="group-a">' + a.name + '</div>';
if (a.bList && a.bList.length > 0) {
$.each(a.bList, function(j, b) { // 遍歷 B 數組
html += '<div class="group-b">' + b.title + '</div>';
if (b.cList && b.cList.length > 0) {
html += '<ul class="group-c">';
$.each(b.cList, function(k, c) { // 遍歷 C 數組
html += '<li>' + c.name + ':' + c.value + '</li>';
});
html += '</ul>';
}
});
}
});
$('#container').html(html);
}
// fetch + async/await
async function loadData() {
try {
const response = await fetch('/api/data');
const listA = await response.json(); // 自動解析
const html = listA.map(a => `
<div class="group-a">${a.name}</div>
${a.bList?.map(b => `
<div class="group-b">${b.title}</div>
${b.cList?.map(c => `
<li>${c.name}: ${c.value}</li>
`).join('')}
`).join('')}
`).join('');
document.getElementById('container').innerHTML = html;
} catch (error) {
console.error('加載失敗:', error);
}
}
瀏覽器 Network 面板 → Response 標籤,確認 JSON 結構:
[
{
"id": 1,
"name": "A1",
"bList": [
{
"id": 10,
"title": "B1",
"cList": [
{"name": "C1", "value": 100},
{"name": "C2", "value": 200}
]
}
]
}
]
| 問題 | 原因 | 解決 |
|---|---|---|
| data 為字符串而非對象 | 漏寫 `dataType: 'json'` 或服務端未設置 Content-Type | 補全 dataType 或服務端加 `application/json` |
| 遍歷報 undefined | 字段名不匹配(如 `bList` vs `b_list`) | 檢查實體類 @JsonProperty 或統一命名策略 |
| 數組為 null 導致報錯 | 後端返回 null 而非空數組 | 前端加 `?.` 可選鏈或 `|| []` 兜底 |
| 大數據量頁面卡頓 | 一次性渲染大量 DOM | 虛擬列表/分頁/懶加載 |
核心口訣:dataType:json 自動解析,瀏覽器看 Response,可選鏈防空指針,ES6 模板字符串渲染。