0

我正在尝试使用 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"},
        ]
}

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

所以我的结论是返回的格式有问题。问题是我不能修改这个网络服务。如何使用“格式错误”的 json 结构?

谢谢,

问候

编辑:

这是 Web 服务签名:

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

2 回答 2

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 的回答基本相同:eval对 JSON 字符串执行不安全以获取可用对象。在使用此方法之前,请确保您信任来源,因为任何隐藏在 JSON 中的恶意内容都将被执行。

编辑:我有一点时间来实际测试这个,结果发现 Alex 的函数有一个小错误。JSON 字符串(变量 'd')需要用括号括起来才能作为对象进行评估——我已经相应地编辑了上面的代码。

虽然上面将加载不太严格有效的 JSON(属性名称周围缺少引号、单引号而不是双引号等),但它确实有其局限性。您在此 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);

虽然这很麻烦,但我强烈建议修复 Web 服务,以便它返回正确、有效的 JSON。

于 2010-09-29T08:50:12.230 回答
0

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

function readData(data){
    var subArr =  eval(data.ListOfPersons);
    alert(subArr[0].FirstName);
}
于 2010-09-29T08:44:44.950 回答