这是我自制的序列化类:
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},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" } }