我正在使用JQuery的getJSON函数来调用SharePoint 2010中可用的REST服务。除非SharePoint数据包含撇号,否则一切似乎都能正常工作。当数据包含撇号时,getJSON调用中的回调将不会执行。
在从SharePoint返回的数据中,撇号似乎使用“\”进行转义。单引号和其他字符似乎不会产生问题。
$(document).ready(function () {
$.getJSON(
"http://<server>/<site>/_vti_bin/listdata.svc/Tasks", null,
function (data) {
alert("Function called");
});
});
还有其他人遇到过这样的事吗?
答案 0 :(得分:7)
经过进一步调查,我认为我发现了这个问题。我创建了一个包含单个项目的简单列表,其中 Test'作为title字段的值。最后的撇号说明了这个问题。 SharePoint似乎在返回的JSON值中转义了撇号:
{ “d”:{ “结果”:[ { “__metadata”:{ “uri”:“http:////_vti_bin/listdata.svc/JSONTest(1)”,“etag”:“W / \”2 \“”,“type”:“Microsoft.SharePoint.DataService.JSONTestItem” },“Id”:1,“ContentTypeID”:“0x0100AC5DC67105487A4B87E86D93A3276612”,“ContentType”:“Item”,“Title”:“Test \'”,“Modified”:“\ / Date( 1292244302000)\ /“,”创建“:”\ /日期(1292244205000)\ /“,”CreatedBy“:{ “__deferred”:{ “uri”:“http:////_vti_bin/listdata.svc/JSONTest(1)/ CreatedBy” } 。 。
根据JSON规范,撇号似乎不是以JSON格式转义的有效字符:
RFC 4627 JSON 2006年7月
字符串的表示类似于C中使用的约定 编程语言家族。字符串的开头和结尾 引号。所有Unicode字符都可以放在 除了必须转义的字符之外的引号: 引号,反向实线和控制字符(U + 0000 通过U + 001F)
使用ajaxError函数我确实收到一条消息,告诉JSON无效。
要处理这种情况,您可以执行以下操作。我使用JQuery模板插件(tmpl)来格式化JSON结果。还需要更多的错误处理来处理进一步可能的JSON解析失败。
$.ajax({
url: "http://<server>/<site>/_vti_bin/listdata.svc/<list>",
dataType: "json",
success: function(data) {
//alert("successful");
$("#templateID").tmpl(data.d.results).appendTo("#elementID");
},
error: function(data) {
//alert("error");
var sCleanJSON = data.responseText.replace(/\\'/g,"'");
var objJSON = $.parseJSON(sCleanJSON );
$("#templateID").tmpl(objJSON.d.results).appendTo("#elementID");
}
});
答案 1 :(得分:2)
这听起来很奇怪......如何使用$.get()
代替$.getJSON()
,然后将响应按到适当的JSON格式,最后使用$.parseJSON()
来获取JSON对象。
答案 2 :(得分:0)
尝试jQuery SPServices插件,非常方便易用,唯一的就是返回XML数据。
答案 3 :(得分:0)
我遇到了类似的情况。显然是.NET 3.5 SP1中的错误......
结帐http://charliedigital.com/2011/07/25/jquery-parsererror-and-wcf-data-services/ 用于修复/解决方法。