WebMethod返回JSON,但我的$ .ajax()回调中的响应obj只是一个字符串

这是我自制的序列化类:

public class JsonBuilder { private StringBuilder json; public JsonBuilder() { json = new StringBuilder(); } public JsonBuilder AddObjectType(string className) { json.Append("\"" + className + "\": {"); return this; } public JsonBuilder Add(string key, string val) { json.AppendFormat("\"{0}\":\"{1}\",", key, val); return this; } public JsonBuilder Add(string key, int val) { json.AppendFormat("\"{0}\":{1},", key, val); return this; } public string Serialize() { return json.ToString().TrimEnd(new char[] { ',' }) + "}"; } } 

这是Web方法

 [WebMethod] public static string GetPersonInfo(string pFirstName, string pLastName) { var json = new JsonBuilder().AddObjectType("Person"); json.Add("FirstName", "Psuedo" + pFirstName).Add("LastName", "Tally-" + pLastName); json.Add("Address", "5035 Macleay Rd SE").Add("City", "Salem"); json.Add("State", "Oregon").Add("ZipCode", "97317").Add("Age", 99); return json.Serialize(); } 

Ajax调用客户端

  $.ajax( { type: "POST", url: "Default.aspx/GetPersonInfo", data: JSON.stringify(name), contentType: "application/json; charset=uft-8", dataType: "json", success: function (rsp) { SetPerson(rsp); }, error: function (rsp) { alert(rsp); } }); 

最后,我的回调方法

 function SetPerson(rsp) { $('#fName').val(rsp.d.FirstName); $('#lName').val(rsp.d.LastName); $('#address').val(rsp.d.Address); $('#city').val(rsp.d.City); $('#state').val(rsp.d.State); $('#zip').val(rsp.d.ZipCode); SetPerson(rsp.d.Age); } 

rsp.d是一个包含所有属性的字符串……属性本身是未定义的。 我知道我在这里缺少一些简单的东西。

从服务器返回的字符串

 "Person": {"FirstName":"Psuedomatt","LastName":"Tally-cox","Address":"5035 Macleay Rd SE","City":"Salem","State":"Oregon","ZipCode":"97317","Age":99} 

您不应手动序列化返回值; ASP.NET将为您完成。 尝试这样的事情:

 [WebMethod] public static Person GetPersonInfo(string pFirstName, string pLastName) { // Assuming you have a server-side Person class. Person p = new Person(); p.FirstName = "Pseudo" + pFirstName; p.LastName = "Tally-" + pLastName; p.Address = "5035 Macleay Rd SE"; p.City = "Salem"; p.State = "Oregon"; p.ZipCode = "97317"; // ASP.NET will automatically JSON serialize this, if you call it with // the correct client-side form (which you appear to be doing). return p; } 

如果你需要返回更动态的东西,就像你的例子似乎正在做的那样,你可以使用匿名类型:

 [WebMethod] public static object GetPersonInfo(string pFirstName, string pLastName) { // ASP.NET will automatically JSON serialize this as well. return new { FirstName = "Pseudo" + pFirstName, LastName = "Tally-" + pLastName, Address = "5035 Macleay Rd SE", City = "Salem", State = "Oregon", ZipCode = "97317" } }