Spring 透過 HttpMessageConverter<T> 實現 HTTP 訊息與物件雙向轉換。引入 Jackson 後,RequestMappingHandlerAdapter 自動裝配 MappingJackson2HttpMessageConverter。
// JS
$.post("testJson", {name:"abc", age:23});
// Controller
@PostMapping("/testJson")
public Person testJson(Person person) { ... } // 自動綁定
// JS: contentType 必須指定
$.ajax({
url: "testJson6",
type: "POST",
contentType: "application/json;charset=utf-8",
data: JSON.stringify([{name:"A",age:1},{name:"B",age:2}]),
success: ...
});
// Controller: @RequestBody 必加
@PostMapping("/testJson6")
public String testJson6(@RequestBody List persons) { ... }
// jQuery 擴充:表單轉物件
$.fn.serializeObject = function() {
var o = {}, a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
o[this.name] = [].concat(o[this.name], this.value);
} else o[this.name] = this.value;
});
return o;
};
// 使用
var json = JSON.stringify($('form').serializeObject());
$.ajax({ contentType: "application/json", data: json, ... });
| 場景 | 方案 |
|---|---|
| 單表單 + 額外參數 | 後端接收 @RequestParam("formJson") String + 自定義轉換器或 Jackson 手動解析 |
| 多表單合併提交 | 前端組裝陣列 [{form1}, {form2}],後端 @RequestBody List |
| 一個表單多實體(同名欄位) | 命名 name="field[0]",配合自定義 Converter 解析 |
@PostMapping("/returnJson")
@ResponseBody
public AjaxResult returnJson() {
return AjaxResult.success(Map.of("user", user, "token", token));
}
// 通用響應封裝
public class AjaxResult implements Serializable {
private String code; // 0000 成功, 0001 失敗
private String message;
private Object data;
// getter/setter + 靜態工廠方法 success()/fail()
}
contentType: application/json → 請求體為 JSON 字串,見於 Request Payload@RequestBody 僅讀取 Request PayloadObjectMapper 格式化@CrossOrigin