【问题标题】:Unexpected Token : when trying to parse a JSON stringUnexpected Token:尝试解析 JSON 字符串时
【发布时间】:2012-12-16 17:02:30
【问题描述】:

我正在尝试解析这个 JSON 字符串:

{ "RESULTS": [ { "name": "Thessaloniki GR", "type": "Sailing", "l": "/sailing-weather/beach:Porto%20Carras%20Marina 45904" }, { "name": "Thessaloniki, Greece", "type": "city", "c": "GR", "zmw": "00000.1.16622", "tz": "Europe/Athens", "tzs": "EET", "l": "/q/zmw:00000.1.16622" } ] }

从here检索

这是我的sn-p:

$(document).ready(function () {

  $("#w11").autocomplete({
        source: function (a, b) {
            $.ajax({
                url: "http://autocomplete.wunderground.com/aq",
                dataType: "jsonp",
                data: {
                    format: "jsonp",
                    query: a.term
                },
                success: function (a) {
                    for (i in data.RESULTS) {
                        console.log(data.RESULTS);
                    }
                }
            })
        }
    });


});​

这在第一行给我一个错误Uncaught SyntaxError: Unexpected token : { "RESULTS": [

如何解析 JSON 结果?

【问题讨论】:

  • 你的 jquery 代码有错误
  • 您的代码有一些问题,但不是问题所在。问题是 1. 您缺少几个分号。我强烈建议不要依赖 automatic semicolon insertion 的白痴。 2. 你似乎成为了The Horror of Implicit Globals 的牺牲品,因为你没有在任何地方声明i。 3. 您的循环通过console.log(data.RESULTS); 重复记录您的整个响应。你可能是指console.log(data.RESULTS[i]); 或其他什么。
  • 并且success: function (a) 中的a 应该是data。

标签: jquery json


【解决方案1】:

你告诉 jQuery 期待JSON-P,而不是JSON:

dataType: "jsonp"

...但结果是 JSON。 JSON-P 和 JSON 是根本不同的东西。这是一个 JSON 响应示例:

{"foo": 42}

以下是 JSON-P 响应的样子:

callback({"foo": 42});

或

callback({foo: 42});

如果http://autocomplete.wunderground.com/a 与运行您的代码的文档不在同一个来源,则由于Same Origin Policy,您将无法通过ajax 从中检索JSON(除非相关服务器支持@987654324 @,允许您的请求来源,并且用户拥有的浏览器也支持 CORS)。我怀疑这就是您尝试使用跨域工作的 JSON-P 的原因。但问题是,服务器 也必须支持 JSON-P。尽管 URL 中有 format=jsonp,但服务器并未使用 JSON-P 进行响应,而是使用 JSON。

在 cmets 中,您链接到 their docs for that API,这表明他们确实支持 JSON-P,只是在 URL 中使用非标准参数名称(cb 而不是更常见的callback)。

所以这应该可以工作(我还修复了我在对该问题的评论中提到的代码问题):

$.ajax({
    url:      "http://autocomplete.wunderground.com/aq",
    dataType: "jsonp",
    jsonp:    "cb",     // <================= New bit is here
    data:     {
        format: "json", // <=== "json" not "jsonp" according to the docs, but I think the "cb" argument overrides it anyway
        query:  a.term
    },
    success:  function (data) { // <=== `data`, not `a`
        var i;
        for (i in data.RESULTS) {
            console.log(data.RESULTS[i]); // <=== Use [i] here
        }
    }
}); // <=== Semicolon was missing

事实上它确实有效:Live Example | Source

jsonp 参数告诉 jQuery 使用哪个 URL 参数来定义 JSON-P 回调的名称。默认为标准 callback,但该 API 使用非标准参数。

【讨论】:

  • 我明白了。我最初使用 JSON,但由于同源策略我很困惑并将其转换为 JSONP。那么,如果您无法检索没有相同来源的 JSON,为什么他们首先提供它? wunderground.com/weather/api/d/docs?d=autocomplete-api
  • @jQuerybeast:可能用于检索服务器端,例如在 PHP 中通过cURL。如果您查看他们的code examples page,其中绝大多数是用于服务器端的。但请注意,它们确实支持 JSON-P 进行某些操作。哦,等等,看 - 他们确实支持 JSON-P 用于该操作,你只是缺少一个参数。正在更新答案...
  • 谢谢一百万。我不仅学到了我的错误,而且你教会了我很多
  • @jQuerybeast:不用担心,我真的很高兴能帮上忙! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多