使用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不能成功解析。