AJAX调用和干净的JSON,但语法错误:缺less; 在陈述之前
我正在使用此代码进行跨域JSONP调用:
jQuery.ajax({ async: true, url: 'http://mnews.hostoi.com/test.json', dataType: 'jsonp', method: "GET", error: function (jqXHR, textStatus, errorThrown) { console.log(textStatus + ': ' + errorThrown); }, success: function (data, textStatus, jqXHR) { if (data.Error || data.Response) { exists = 0; } } });
在Firebug中debugging时,出现以下错误:
SyntaxError: missing ; before statement
但是,当我通过像jsonlint.com这样的工具传递我的json对象(通过JQ代码中的链接可用)时,它表示它是有效的JSON。 而且我也没有发现任何exception。 它怎么会返回一个语法错误? 这是一些JSONP细节我没有得到或什么?
JSON示例
{"news":[ { "sentences": [ "Neuroscientists have discovered abnormal neural activity...", "The researchers found that these mice showed many symptoms...", "\"Therefore,\" the study authors say, \"our findings provide a novel.." ], "summaryId": "ZJEmY5", "title": "Abnormal neural activity linked to schizophrenia" }]}
提前致谢。
JSONP不是JSON。 一个JSONP响应将包含一个JavaScript脚本,它只包含一个函数调用(对于一个预定义的函数)和一个参数(这是一个符合JSON语法的JavaScript对象文字)。
你得到的回应是JSON,而不是JSONP,所以你的努力来处理它作为JSONP失败。
将dataType: 'jsonp'
更改为dataType: 'json'
(或者完全删除该行,服务器发出正确的内容types,因此不需要覆盖它)。
由于脚本的运行方式与JSON不同,因此您还需要采取措施 (其中大部分但不是全部都需要您控制提供JSON的主机)才能解决相同的源策略 。
错误是因为它返回JSON而不是JSONP。
JSONP应该看起来像
someCallBackString({ The Object });
这是一个工作的例子
$.ajax({ type: 'GET', url: 'http://xxx.amazonaws.com/file.json', dataType: 'jsonp', jsonpCallback: 'callback', success: function(json){ console.log(json); } });
你应该把callback
放在你的file.json
的开头,如:
callback({"item":{".......
正如epascarello 指出的那样 ,JSONP响应必须如下发送:
callBackFunction({ JSON Object })
然后可以设置来电function,如:
var url = "http://someremoteurl.com/json"; $.getJSON(url + "?callback=?", null, function(data) { callBackFunction(data); });
然后你可以循环响应数据为:
function callBackFunction(data) { console.log(data); }
如果您使用“ callback =? ”参数,则您在服务器端的响应应如下所示:
$_callback = $_GET['callback']; echo $_callback . '(' . json_encode(YOUR_VARIABLE) . ');';
如果没有定义“ callback =? ”参数,你的回应应该是这样的:
echo '[' . json_encode($_return_array) . ']';
如果问题与Ruby相关,那么在你的控制器中确保你正确的渲染格式。 例:
def view_product data = Product.find params[:id] render :json => data, :callback => params[:callback] end
在你的render方法中,你应该有:callback参数,否则它将在json而不是jsonp中呈现。