未捕获的SyntaxError:意外的令牌:在WeatherUnderground响应中

时间:2016-01-15 04:39:56

标签: javascript jquery ajax

我正在通过以下方式向WeatherUnderground服务发出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');
    }
});

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

Uncaught SyntaxError:意外的令牌:

响应的第一行加下划线

{ "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"
    }, ...

可能导致此问题的原因是什么?

提前谢谢!

2 个答案:

答案 0 :(得分:0)

你正在使用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)); });

这会对你有所帮助。

答案 1 :(得分:0)

也可能值得注意的是,在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>