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 只是一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET使用WebMethod

在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON

是否可以在 JSON 中更改页面 webmethod 响应,删除 .d 节点?

通过jquery ajax将json对象传递给webmethod

使用 WebMethod 返回带有 Message 的警报框

如何从 web 服务返回 JSON