WebMethod 返回 JSON 但我的 $.ajax() 回调中的响应 obj 只是一个字符串
Posted
技术标签:
【中文标题】WebMethod 返回 JSON 但我的 $.ajax() 回调中的响应 obj 只是一个字符串【英文标题】:WebMethod returning JSON but the response obj in my $.ajax() callback is only a string 【发布时间】:2011-07-10 20:41:53 【问题描述】:这是我自制的序列化类:
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[] ',' ) + "";
这是网络方法
[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
【问题讨论】:
你能告诉我们从服务器返回的 JSON 字符串是什么样的吗? @Jeremy Battle 更新了帖子以包含返回的字符串 顺便说一句,我会查看javascriptSerializer 和JavaScriptConverter 课程,以免让自己头疼。 【参考方案1】:您不应该手动序列化返回值; 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"
【讨论】:
@Dave Ward 这很有帮助,但不是我所追求的。我正在试验我不想创建一个类来表示数据服务器端的情况。 查看我的编辑以获得更动态(虽然实际上不是“动态”)的方法。 @Dave Ward 什么版本的 asp.net 开始支持这个?我们正在与我的公司一起使用 3.5。 3.5 支持所有这些。匿名类型实际上在后台编译为静态类型的类。它们与 4.0 的dynamic
类型不同。
因为响应是双重序列化的。 ASP.NET 自动 JSON 序列化响应。您正在返回手动构建的 JSON 字符串,然后 ASP.NET 使用 JavaScriptSerializer 将您的 JSON 透明地序列化为... JSON。因此,当 jQuery 解包一级 JSON 序列化时,您返回的数据仍然是 JSON 字符串。基本上,您永远不应该手动 JSON 序列化页面方法和“脚本服务”的返回。如果您使用它,JavaScriptSerializer 本身就可以很好地工作。一开始并不明显它会自动为您工作。以上是关于WebMethod 返回 JSON 但我的 $.ajax() 回调中的响应 obj 只是一个字符串的主要内容,如果未能解决你的问题,请参考以下文章
在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON
是否可以在 JSON 中更改页面 webmethod 响应,删除 .d 节点?
通过jquery ajax将json对象传递给webmethod