未捕获的语法错误:意外的标记:在天气地下响应中

Uncaught SyntaxError: Unexpected token : in WeatherUnderground response

本文关键字:地下 响应 意外 语法 错误      更新时间:2023-09-26

我通过以下方式向WeatherUnderground service发出ajax请求:

$.ajax({
    url : 'http://autocomplete.wunderground.com/aq?query=' + $input.val(),
    type: 'GET',
    dataType : "JSONP",
    success : function(parsed_json) {
        var obj = JSON.parse(parsed_json);
        alert(typeof parsed_json);
        for (var i = 0; i < obj.RESULTS.length; i++) {
            suggestions[i] = obj.RESULTS[i].name;
        }
    },
    error : function(parsed_json){
        alert('Error');
    }
});

但是当我得到回复时,我看到以下错误:

未捕获的语法错误: 意外令牌 :

响应的第一行带有下划线

{ "RESULTS": [
    {
        "name": "Dakar, Senegal", 
        "type": "city", 
        "c": "SN",
        "zmw": "00000.1.61641",
        "tz": "Africa/Dakar",
        "tzs": "GMT",
        "l": "/q/zmw:00000.1.61641",
        "ll": "14.730000 -17.500000",
        "lat": "14.730000",
        "lon": "-17.500000"
    }, ...

什么可能导致此问题?

提前谢谢你!

你正在使用JSONP意味着JSONP(带有填充的JSON),它与json不同。详情请参阅此链接。链接: http://json-jsonp-tutorial.craic.com/index.html

使用 JSONP 在客户端的唯一更改是向 URL 添加回调参数。最简单的方法是添加'callback=?',在这种情况下,jQuery将生成一个唯一的函数名称并将其传递给服务器。

服务器上,您需要获取"callback"参数,而不是返回原始 JSON,而是将该字符串包装在函数定义中,如下所示的"()"。您不需要提前知道函数名称 - 只需从该回调参数中获取它即可。

您还应该将内容类型设置为"application/javascript",尽管这在我的测试中似乎并不重要。

回到客户端,您将返回的函数视为原始 JSON 对象。

`var url = host_prefix + '/jsonp?callback=?';

$.getJSON(url, function(jsonp){ $("#jsonp-response").html(JSON.stringify(jsonp, null, 2)); });

这将对您有所帮助。

可能还值得注意的是,在 wunderground API 的情况下,它们提供了一个回调参数,因此您可以通过以下方式完全避免 ajax......

<body>
<input id="inp"/>
<input type="button" id="btn" value="Go!">
<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>
<script>
$("#btn").on("click",getDeets);
function getDeets(){
var str=$("#inp").val();
if(document.getElementById("myscr")){
document.body.removeChild(document.getElementById("myscr"));
}
var scr=document.createElement("script");
scr.id="myscr";
document.getElementById("myscr").src="http://autocomplete.wunderground.com/aq?query="+str+"&cb=myfunc";
document.body.appendChild(scr);
}
function myfunc(o){
console.log(o);
}
</script>
</body>