[WebMethod],返回 JSON 需設置 contentType: "application/json; charset=utf-8"POST,data 必須是 JSON 字符串(非 JS 對象)[WebMethod] public string GetString(string name) { return "Hello " + name; }
// jQuery
$.ajax({
type: "POST", url: "WebService1.asmx/GetString",
dataType: "json", contentType: "application/json; charset=utf-8",
data: "{'name':'zhangsan'}", // 單引號包裹鍵值,整體為字符串
success: function(json) { alert(json.d); } // ASP.NET 返回 JSON 包裝在 .d 中
});
public class Person { public string Name {get;set;} public int Age {get;set;} ... }
[WebMethod] public string ProcessPersonalInfo(Person person) { return person.Name + person.Tel; }
// jQuery: 參數名必須與 WebService 參數名一致 (person)
data: "{'person':{'Name':'zhangsan','Age':28,'Address':'beijing','Tel':'01082658866'}}"
ASP.NET 自動將 JSON 反序列化為 Person 實例。
[WebMethod] public List<Person> GetPersonalList() { ... return list; }
// jQuery 遍歷返回數組
success: function(json) { $(json.d).each(function() { alert(this.Name + " - " + this.Age); }); }
[WebMethod] public Person GetPerson() { return new Person { Name="zhangshan", ... }; }
// jQuery 直接訪問屬性
success: function(json) { var p = json.d; alert(p.Name + " " + p.Age); }
結論:WebService 返回類型不必標記 [Serializable] 也能正常 JSON 序列化。ASP.NET 內置 JavaScriptSerializer 能處理公共屬性的類。
[WebMethod] public Hashtable GetPersonalHashtable() { ... return ht; }
// jQuery 遍歷
success: function(json) { for(var key in json.d) { alert(key + ":" + json.d[key].Name); } }
雖然傳統認爲實現 IDictionary 的類型不能直接作為 WebService 返回值,但實測在 JSON 協議下可正常工作(ASP.NET 將其序列化為鍵值對象)。
contentType: "application/json; charset=utf-8" 必須指定。[Serializable]。json.d 獲取(ASP.NET AJAX 包裝格式)。