2

この 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" } ] }

ここから取得されます

これは私のスニペットです:

$(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 結果を解析するにはどうすればよいですか?

4

1 に答える 1

9

JSONではなくJSON -Pを期待するように jQuery に指示しました。

dataType: "jsonp"

...しかし、結果は JSON です。JSON-P と JSON は根本的に異なるものです。JSON 応答の例を次に示します。

{"foo": 42}

JSON-P 応答は次のようになります。

callback({"foo": 42});

また

callback({foo: 42});

コードが実行されているドキュメントと同じオリジンにない場合、 Same Origin Policyhttp://autocomplete.wunderground.com/aのため、ajax 経由で JSON を取得することはできません(問題のサーバーがCORSをサポートしていない限り、リクエストのオリジンを許可します) 、およびユーザーが使用しているブラウザーも CORS をサポートしています)。クロスオリジンで動作するJSON-Pを使用しようとした理由だと思います。ただし、サーバーは JSON-P もサポートする必要があります。URL にあるにもかかわらず、サーバーは JSON-P ではなく JSON で応答しています。format=jsonp

コメントで、その API のドキュメントにリンクしました。これは、URL で非標準の引数名を使用するだけで、JSON-P をサポートしていることを示しています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 | ソース

このjsonp引数は、JSON-P コールバックの名前を定義するために使用する URL パラメーターを jQuery に指示します。デフォルトは標準ですが、callbackその API は非標準の引数を使用します。

于 2012-12-16T08:40:16.360 に答える