使用jQuery使用Microsoft Web服务

时间:2010-09-29 08:31:58

标签: jquery json webservice-client

我正在尝试使用jQuery来使用WCF Web服务。 返回的Json数据是:

{
    "ListOfPersons":
        "[
            {'Id':1,'FirstName':'Foo','LastName':'Bar'},
            {'Id':2,'FirstName':'Hello','LastName':'World'},
            {'Id':3,'FirstName':'Tanks','LastName':'Giving'},
        ]"
}

我在Jquery中使用的函数是:

 var url = 'http://path/to/webservice.svc/ReturnTheList';
    $.getJSON(url, function (data) {
        success: readData(data)
    });

    function readData(data){
        alert(data.ListOfPersons[0].FirstName);
    }

问题是警报不会返回任何内容。

并且,如果我将Json修改为:

{
    "ListOfPersons":
        [
            {"Id":1,"FirstName":"Foo","LastName":"Bar"},
            {"Id":2,"FirstName":"Hello","LastName":"World"},
            {"Id":3,"FirstName":"Tanks","LastName":"Giving"},
        ]
}

(我用双引号替换了简单的引号,并在[和之后]之前删除了双引号。)

所以我得出结论,这是返回格式的问题。 问题是我无法修改此Web服务。 如何使用“格式不良”的json结构?

谢谢你,

此致

编辑:

以下是Web服务签名:

 [OperationContract]
        [WebInvoke(Method = "GET",
             BodyStyle = WebMessageBodyStyle.WrappedResponse,
             ResponseFormat = WebMessageFormat.Json)]
        string ReturnTheList();

2 个答案:

答案 0 :(得分:4)

较新版本的jQuery(我认为1.4以上)根本不会加载无效的JSON。

您有两个选择 - 您可以编写一个服务器端代理来调用Web服务,解析无效的JSON并以有效的形式返回它,或者您可以使用此函数(由Alex Sexton编写,而不是我)!

jQuery.getInvalidJSON = function(url, data, callback) {
    return jQuery.get(url, data, function(d){
        callback.call(this, (new Function('return (' + d + ')'))());
    }, "text");
};

这与Dewfy的答案基本相同:在JSON字符串上执行不安全的eval以获取可用对象。 在使用此方法之前确保您信任源,因为将执行隐藏在JSON中的任何恶意内容。

编辑:我有一点时间来实际测试这个,结果发现Alex的功能有一个小错误。 JSON字符串(变量'd')需要包含在括号中以作为对象进行评估 - 我已相应地编辑了上述代码。

虽然上面将加载的JSON不完全严格有效(缺少引用属性名称,单引号而不是double等),但它确实有其限制。您正在使用此Web服务处理的JSON非常简单。

似乎是数组周围的双引号引起了大多数问题。你可以像这样解决这个问题:

jQuery.getInvalidJSON = function(url, data, callback) {
    return jQuery.get(url, data, function(d){
        var cleaned = d.replace(/"\[/g, '[').replace(/\]"/g, ']');
        callback.call(this, (new Function('return (' + cleaned + ')'))());
    }, "text");
};

并称之为:

$.getInvalidJSON(url, null, readData);

这非常hacky,我强烈建议修复Web服务,以便返回正确的,有效的JSON。

答案 1 :(得分:0)

要获得所需,只需使用 eval - 将对的第二部分转换为jscript数据结构:

function readData(data){
    var subArr =  eval(data.ListOfPersons);
    alert(subArr[0].FirstName);
}