推 LPH66: 注意到中間的 .toJson 方法, 它幫你把 Java 物件 map 轉成 03/28 13:11
→ LPH66: 中介的 JSON 格式, 在網路上傳遞的是這個格式的物件 03/28 13:12
→ LPH66: 前端的 javascript 收到這個格式後再將其轉成 js 的物件 03/28 13:12
→ LPH66: $.getJSON 即是前端接收用的函數, 它把 JSON 解碼後傳進 03/28 13:13
→ LPH66: 你的 callback 的 data 參數上 03/28 13:13
→ LPH66: 也就是說, 你的問題在不知道中間有一層中介的 JSON 格式 03/28 13:14
→ LPH66: 以為是後端的 Java 物件直接變成前端的 JavaScript 物件 03/28 13:14
我剛剛又測試了以下CODE,將$.getJSON改成$.get、$.post:
$.post(
"/TestSpring4Ajax2/search/api/getSearchResult2.do",
$.param(search),
function(data) {
//第一種獲得javascript物件的方法
//var obj = eval('(' + data + ')');
//第二種獲得javascript物件的方法
var obj = JSON.parse(data);
var json = "<h4>Ajax Response</h4><pre>"
+ obj.email + "</pre>";//javascript物件
$('#feedback').html(json);
}
);
---------------------------------------
使用$.get、$.post時,回調函數的參數必須先另外轉成javascript物件,才可以直接使用
所以這是因為$.get、$.post沒有將中介的json格式的物件,轉成javascript物件,
所以必須回調函數接收到參數,另外轉成javascript物件??
→ ssccg: 文件寫的很清楚,data是用$.parseJSON()解析response而來 03/28 14:52
→ ssccg: $.get、$.post這些都一樣是$.ajax的捷徑版,重點在dataType 03/28 14:57
→ ssccg: 設為'json',不過預設的Intelligent Guess只要server有回適 03/28 14:59
→ ssccg: 當的content-type header,也是會自動parseJSON 03/28 14:59
→ ssccg: 你可以試看看$.get(url, function(data) {...}, 'text')和 03/28 15:02
→ ssccg: $.get(url, function(data) {...}, 'json') data是什麼型別 03/28 15:03
謝謝,講得真是清楚。
※ 編輯: lueichun (101.10.6.169 臺灣), 03/28/2022 15:19:52
→ ssccg: server端的spring如果是@RestController/@ResponseBody,回 03/28 15:22
→ ssccg: 傳值會經過HttpMessageConverter轉換,預設的有byte[] → 03/28 15:23
→ ssccg: application/octet-stream、String → text/plain 03/28 15:24
→ ssccg: Resource → 看resource檔案種類 03/28 15:25
→ ssccg: 其他各種物件 → application/json (看classpath上有哪個 03/28 15:26
→ ssccg: json library會有不同的預設converter) 03/28 15:27
→ ssccg: Map會變成JSON字串是因為有converter,String不會再轉換 03/28 15:28