【问题标题】:How can I interpret JSON returned from jQuery.ajax and using a POST action?如何解释从 jQuery.ajax 返回的 JSON 并使用 POST 操作?
【发布时间】:2009-03-04 21:27:30
【问题描述】:

我有以下 jQuery 代码:

$.ajax({
    type: "POST",
    url: "Services/MyService.asmx/Select",
    dataType: "json",
    data: "{'data':'test'}",
    contentType: "application/json; charset=utf-8",
    success: function(msg){ 
                alert(msg); 
             },
    error: function(xhr){ alert(xhr.statusText);}                
});

对该方法的调用返回以下内容:

"{"FirstName":"James"}"

当我取回值时,我的警报会返回完整的 json 字符串。如果我尝试做alert(msg.FirstName),我会得到“未定义”。

我见过很多使用 getJSON() 方法的例子;但是,我还没有看到将其用于 POST 动词的方法。谁能指出我出错的正确方向?根据 jquery 文档,返回值应该是相同的 dataType (json) 所以我不确定我缺少什么。

编辑: 我查看了我的服务,它与我在返回字符串的方法签名方面找到的示例相匹配。我还确认响应类型是 application/json。

编辑2: 更新了响应以包含外部引号。我还使用自定义 JavaScriptConverter 来进行 JSON 序列化。自定义转换器只获取我的对象属性(在本例中为 FirstName)并将其加载到 Dictionary 集合中,ASP.Net AJAX Extensions v1.0 可以轻松序列化该集合。

编辑3: 查看我在使用 eval() 时遇到的问题(它导致了 Expected ";" 错误),我注意到 json 属性名称也包含在引号中。一旦我从属性名称(而不是值)中删除引号, eval() 就会再次起作用。现在调查这个问题的服务器端。

【问题讨论】:

  • 一旦您解决了转义/引用问题,您就不需要额外的手动 eval()。 jQuery 会自动为你做这些。
  • 遗憾的是,不管有没有转义,我仍然需要 eval() 语句。我不喜欢它,但它可以工作,而且它是在匿名函数的上下文中,所以我觉得可以使用它,直到我可以将客户端升级到 .Net 3.5。

标签: jquery json post


【解决方案1】:

jQuery .ajax 的用法看起来很可靠。您如何验证返回的数据?萤火虫?提琴手?因为.asmx webservices 不会像{"FirstName":"James"} 这样返回数据。响应看起来更像:

{"d":{"FirstName":"James"}}

(见http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/

对于您的success 回调,请尝试:

function(res) { alert(res.d.FirstName) }

编辑:看到您对 ASP.Net AJAX v1.0 的更新和评论:

我不确定 v1.0 如何序列化您的响应,但我的猜测是,如果您在 WebService 方法中进行自己的自定义 JSON 序列化,响应可能会再次被 JSON 序列化时间>。所以你要序列化两次。

我相信您正在使用的所有组件都在做他们应该做的事情,只是现在您的 success 回调需要手动反序列化,因为您在服务器上手动序列化:

function(res) {
    res = eval('(' + res + ')');
    alert(res.FirstName);
}

【讨论】:

  • 我之前也遇到过同样的问题。
  • ASMX 服务仅返回 MS ASP.Net AJAX 3.5 下的 .d 属性。我的客户端还没有升级到 3.5 框架,所以我坚持使用不包含它的 ASP.Net AJAX 扩展的 v1.0。
【解决方案2】:

IIRC 你可以评估字符串,结果将是 json 对象。

myJSON = eval(jsonString);

【讨论】:

  • 为什么我尝试使用 eval,它给了我错误 Expected ';'。我正在研究为什么这不起作用。
  • 啊哈,我上面的 crescentfresh 添加了我忘记的警告 - 用括号括起来,由于某种原因,如果你不这样做,javascript 会混淆。
【解决方案3】:

您可以使用 JSON 对象作为第二个参数来定义您的帖子变量。

例子:

$.getJSON("service.py",
    { foo: bar },
    function(data) {
        $.each(data, function() { // blah });
    }
);

编辑:我明白你现在的意思了。您的服务是否将“something/json”作为 MIME 类型返回?如果您正在查看 Firebug 中的响应标头,它应该看起来像这样:

Content-Type    application/json; charset=utf-8

【讨论】:

  • 您提供的代码仍然使用 HTTP GET 动词到服务器方法。我需要一个 HTTP POST。无论第二个参数中的数据如何,您的示例中的 service.py 文件都将通过 http get 进行检索。可悲的是,这对我不起作用。
  • 响应内容类型作为 application/json 从服务返回。
【解决方案4】:

试试这样的:

 result = eval('(' + result.d + ')');

【讨论】:

    【解决方案5】:

    您不能将$getJSON 与通过System.Web.Extensions 序列化的ASMX 服务一起使用。您正在使用$.ajax() 正确拨打电话。

    您是否尝试过使用 Firebug 在成功处理程序中设置断点并检查 msg 值?

    【讨论】:

    • 当我在 firebug 中设置断点并查看 msg 的值时,我得到以下逐字记录 "{"FirstName":"James"}"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多