如何解释从jQuery.ajax返回的JSON并使用POST操作?

时间:2009-03-04 21:27:31

标签: jquery json post

我有以下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。

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

EDIT3: 查看我使用eval()时遇到的问题(它导致Expected ";"错误),我注意到json属性名称也用引号括起来。一旦我从属性名称(而不是值)中删除了引号,eval()再次工作。现在查看此问题的服务器端。

5 个答案:

答案 0 :(得分:5)

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);
}

答案 1 :(得分:2)

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

myJSON = eval(jsonString);

答案 2 :(得分:1)

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

示例:

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

尝试这样的事情:

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