AJAX 早期依賴 XML 作為數據載體,但 XML 繁瑣的解析、冗長的標籤嚴重拖慢前端性能。JSON (JavaScript Object Notation) 以原生 JavaScript 對象字面量語法,實現了「零解析」反序列化,成為現代 Web 應用的標準數據格式。本文詳細講解如何構建基於 JSON 的完整 AJAX 數據傳輸體系。
[瀏覽器] [服務器]
│ │
│ 1. 構建 JS 對象模型 (Auto/Car/Wheel) │
│ 2. JSON.stringify() 序列化 │
│ 3. AJAX POST {json: "..."} ─────────► │
│ │ 4. 反序列化為服務端對象
│ │ 5. 業務處理
│ │ 6. 序列化響應對象
│ 7. JSON.parse() 反序列化 ◄─────── │
│ 8. 更新 UI / 觸發回調 │
構建清晰的對象層次,便於序列化時保持語義結構:
// Auto.js - 根命名空間/包
var Auto = new Object();
// Car.js - 子對象,掛載於 Auto 下
Auto.Car = new Object();
Auto.Car.color = "#fff"; // 默認屬性
Auto.Car.setColor = function(c) { // 行為方法
Auto.Car.color = c;
};
Auto.Car.setColor("#333"); // 運行時修改
// Wheel.js - 更深層級
Auto.Car.Wheel = new Object();
Auto.Car.Wheel.color = "#000";
關鍵點:
引入 Douglas Crockford 的 `json2.js` (兼容舊瀏覽器) 或直接使用原生 `JSON` 對象:
<script src="js/utils/json2.js"></script> <!-- 或依賴原生 -->
// 頁面加載時序列化顯示
window.onload = function() {
var jsonStr = JSON.stringify(Auto); // 或 Auto.toJSONString() 若擴展原型
document.getElementById('body').innerHTML =
'<b>本地對象序列化為 JSON</b>: ' + jsonStr;
};
輸出示例:
{"Car":{"color":"#333","Wheel":{"color":"#000"}}}
結構完整保留,鍵值對應清晰,體積極小。
// AjaxUpdater.js - 簡易封裝
var AjaxUpdater = {
Update: function(method, url, callback, postData) {
var xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
callback(xhr.responseText);
}
};
xhr.send(postData); // JSON 字符串
}
};
// 調用示例
AjaxUpdater.Update('POST', '/api/auto/save', function(response) {
var serverAuto = JSON.parse(response);
console.log('服務端返回顏色:', serverAuto.Car.color);
}, JSON.stringify(Auto));
服務端 (Java/SpringMVC 示例) 接收 JSON,綁定到 DTO,處理後返回更新後的對象:
// Spring MVC Controller
@PostMapping("/api/auto/save")
@ResponseBody
public AutoDto saveAuto(@RequestBody AutoDto auto) {
// 業務邏輯:持久化、計算衍生屬性...
auto.getCar().setColor("#" + Integer.toHexString(new Random().nextInt(0xFFFFFF))); // 模擬服務端修改
return auto;
}
前端回調中反序列化:
function displayResponse(responseText) {
var auto = JSON.parse(responseText); // 核心:一行代碼還原完整對象圖
document.getElementById('body').innerHTML +=
'<br/><b>服務端響應反序列化</b> ' +
'Car色: ' + auto.Car.color +
' Wheel色: ' + auto.Car.Wheel.color;
}
JSON 無日期類型,約定使用 ISO 8601 字符串 (`"2024-01-15T10:30:00Z"`),前後端統一轉換工具類處理。
複雜對象圖中,添加 `__type` 字段標識實際類型,便於服務端多態反序列化 (Jackson `@JsonTypeInfo`)。
| 維度 | JSON | XML |
|---|---|---|
| 解析速度 | 原生解析,極快 | 需 DOM/SAX 解析,慢 5-10 倍 |
| 數據體積 | 無冗餘標籤,體積小 30-50% | 標籤重複,體積大 |
| JS 集成度 | 原生對象字面量,零轉換 | 需遍歷 DOM 樹構構建對象 |
| 可讀性 | 鍵值直觀 | 層次嚴格但冗長 |
| 工具生態 | 現代框架首選,工具鏈成熟 | 傳統企業系統仍在使用 |
JSON + AJAX 不僅是技術棧選型,更代表了「前後端分離、契約驅動、輕量交互」的現代 Web 開發範式。掌握從領域建模、序列化策略、AJAX 封裝到服務端綁定的完整鏈路,是構建高性能、可維護富客戶端應用的核心能力。