我正在尝试使用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();
答案 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);
}