【问题标题】:WebMethod returning JSON but the response obj in my $.ajax() callback is only a stringWebMethod 返回 JSON 但我的 $.ajax() 回调中的响应 obj 只是一个字符串
【发布时间】: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 更新了帖子以包含返回的字符串
  • 顺便说一句,我会查看JavascriptSerializerJavaScriptConverter 课程,以免让自己头疼。

标签: jquery asp.net ajax


【解决方案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 本身就可以很好地工作。一开始并不明显它会自动为您工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2018-02-09
  • 2014-10-24
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多