AJAX 调用并清理 JSON 但语法错误:丢失;声明前

IT技术 javascript jquery ajax json jsonp
2021-02-03 00:24:53

我正在使用以下代码进行跨域 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 中调试时,出现以下错误:

在此处输入图片说明

SyntaxError: missing ; before statement

但是,当我通过 jsonlint.com 之类的工具传递我的 json 对象(可通过 JQ 代码中的链接获得)时,它说它是有效的 JSON。而且我也没有发现任何异常。它怎么会返回一个语法错误?是我没有得到一些 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"
}]}

提前致谢。

6个回答

JSONP 不是 JSON。一个 JSONP 响应将由一个 JavaScript 脚本组成,该脚本只包含一个函数调用(到一个预定义的函数)和一个参数(这是一个符合 JSON 语法的 JavaScript 对象文字)。

您得到的响应是 JSON,而不是 JSONP,因此您在 JSONP 失败时处理它的努力。

更改dataType: 'jsonp'dataType: 'json'(或完全删除该行,服务器发出正确的内容类型,因此您无需覆盖它)。

由于您的脚本在与 JSON 不同的来源上运行,因此您还需要采取措施(大多数,但不是全部,其中要求您控制提供 JSON 的主机)来解决相同的来源策略

我的脚本在不同的来源上运行,是的。我将尝试使用您提供的链接实施 CORS。谢谢。
2021-03-28 00:24:53

错误是因为它返回 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 })

然后可以像这样设置调用者函数:

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) . ']';