使用jQuery,从跨域url访问json,其中json可能形成不良
我正在使用jQuery的ajax函数来访问跨域url。 该url将返回json。 我正处于发现阶段,但我想,因为json值包含几个’&quot’字符串,json eval会抛出错误并停止执行我的客户端脚本。 我得到的错误是“未终止的字符串文字”。 我知道如果我将返回的json硬编码放在本地div中并删除””’ 字符串(和一些隐藏的特殊字符),我可以成功地获得json到eval。 无论是通过解决方法,还是通过修改我的代码,我可以做些什么来从URL中获取json并将其存储在我的客户端javascript中作为有效的json对象?
我目前的代码。 没有定义的函数(success,complete,error,dataFilter)执行:
$(function() { $.ajax({ url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", dataType: "jsonp", success: successFunc, complete: completeFunc, error: errorFunc, dataFilter: dataFilterFunc }); }); function successFunc() { console.log('successFunc(). enter.'); } function completeFunc() { console.log('complete(). enter.'); } function errorFunc() { console.log('errorFunc(). enter.'); } function dataFilterFunc(data, type) { data.replace(/\W/g, ' '); return data; }
问题是JSONP服务,它完全消除了callback
参数。
JSONP 响应只是使用callback
get参数作为函数名称的函数调用:
如果您查看某些JSONP服务的响应,它应该是这样的:
http://somesite.com/jsonp?callback=myCallback
会回来:
myCallback({/*json*/});
虽然您发布的是返回普通 有效 JSON,但它不能作为JSONP响应处理。
嗯。 我不知道jQuery,但我知道JSON。 (我为它写了一个基于C ++的解析器。)我去了你显示的url: http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?
: http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?
format = jsonp&callback http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?
。 Python的JSON解析器接受了,我的经验是Python的JSON解析器是正确的。 请注意:
{ "blah": "string " More more more" }
…是有效的JSON。 "
part在JSON中没有特殊的解释 – 它们只是字符串中的字符。
编辑:更加努力地看待这一点,我发现很有意思的是,无论是什么产生这个都是逃避一些正斜线,但不是全部。 “开始”项目是“/日期(-XXXXX)/”,这是JSON中的文本/Date(-XXXXX)/
– /可以选择转义。 但是,在带有“SpeakerURI”和“URI”键的项目中,它们不会被转义。
编辑:通过我的基于C ++的解析器来完成此操作。 最初它没有接受它,但是这个JSON实际上暴露了我的解析器中的一个错误。
您可以考虑尝试使用jquery-jsponp插件,该插件修复了jQuery的jsonp处理的一些问题。
http://code.google.com/p/jquery-jsonp/
我用它,有很多很好的例子。
你真的需要让你的回调工作,这样你才能看到发生了什么。
更新:我用jsonp进行了一次尝试,我收到了意外的令牌错误。 不知道为什么 – 我可以从URL手动获取数据,将其分配给控制台中的JavaScript变量,这很好。
在一小时内分析您的数据后,
我找到了以下
{ "URI":"/rest/sessions/Maintainable-ASPNET-MVC", "Title":"Maintainable ASP.NET MVC", "Abstract":".....\u003e\u2028Duration: 60-90 minutes\u003cbr\u003e\u2028Subject Area: development....." }
在持续时间和主题区域之前有char \ u2028
\ u2028是行分隔符,所以它的意思是,类型\ n,所以你在引号“”之间有换行符,这可能是根本情况。
如果你删除它,你不会在firebug中看到未终止的字符串文字 。
为了测试这一点,在地址栏中粘贴以下内容,Firefox和Opera失败,而IE8和Chrome正在运行
javascript:alert(eval('[{"Abstract":"\u003e Duration: 60-90 minutes\u003cbr\u003e Subject Area: development."}]'))
有人在博客上写过这个
http://bulknews.typepad.com/blog/2009/02/json-jquery-and-some-unicode-characters-u2028.html
我似乎没有更接近客户端解决方案。 我更改了代码以使用jQuery-jsonp。 它现在看起来像这样:
$(function() { $.jsonp({ url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", async: false, dataType: "jsonp", success: successFunc, complete: completeFunc, error: errorFunc, dataFilter: dataFilterFunc }); }); function successFunc(json, textStatus) { console.log('successFunc(). enter.'); } function completeFunc(xOptions, textStatus) { console.log('complete(). textStatus: ['+textStatus + ']'); } function errorFunc(xOptions, textStatus) { console.log('errorFunc(). textStatus: [' + textStatus + ']'); } function dataFilterFunc(j) { console.log('dataFilterFunc(). enter.'); return j; }
Firebug的控制台日志显示:
X unterminated string literal [{"URI"..... ( the json returned from the server errorFunc(). textStatus: [error] complete(). textStatus: [error]
无论出于何种原因,我的Firefox浏览器(FF v3.0.15,Linux Ubuntu 9.0.4)中的json解析都会抛出“未终止的字符串文字”exception。 我知道如果我删除’&quot’字符串和’Maintainable ASP.NET MVC’块中的两个字符,那么json将成功解析。 由于我无法控制服务器端,我是否可以使用客户端javascript,最终将服务器的json字符串原样转换为客户端json对象。 我认为jsonp的dataFilter属性是为了这个目的而设置的,用于拦截json并“擦除”它。 但是,我的代码中的函数没有被调用,很可能是因为传递给dataFilterFunc函数的json不能成功解析。