1

これが私がやろうとしていることです:

$.getJSON('http://www.youtube.com/oembed?url=http://www.youtube.com/watch%3Fv%3DB-m6JDYRFvk&callback=?', 
           function(data) { console.log(data) });

そのURLをカールすると、次の応答が返されます。

{
    "provider_url": "http:\/\/www.youtube.com\/",
    "title": "Coder Girl",
    "html": "\u003cobject width=\"425\" height=\"344\"\u003e\u003cparam name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/B-m6JDYRFvk?version=3\"\u003e\u003c\/param\u003e\u003cparam name=\"allowFullScreen\" value=\"true\"\u003e\u003c\/param\u003e\u003cparam name=\"allowscriptaccess\" value=\"always\"\u003e\u003c\/param\u003e\u003cembed src=\"http:\/\/www.youtube.com\/v\/B-m6JDYRFvk?version=3\" type=\"application\/x-shockwave-flash\" width=\"425\" height=\"344\" allowscriptaccess=\"always\" allowfullscreen=\"true\"\u003e\u003c\/embed\u003e\u003c\/object\u003e",
    "author_name": "dalechase",
    "height": 344,
    "thumbnail_width": 480,
    "width": 425,
    "version": "1.0",
    "author_url": "http:\/\/www.youtube.com\/user\/dalechase",
    "provider_name": "YouTube",
    "thumbnail_url": "http:\/\/i3.ytimg.com\/vi\/B-m6JDYRFvk\/hqdefault.jpg",
    "type": "video",
    "thumbnail_height": 360
}

しかし、上記のコードを実行しようとすると、Uncaught SyntaxError: Unexpected token :(Chrome)が表示されます。問題はスラッシュのエスケープに関係している可能性があるか、jQueryがJSONPリクエストを送信している可能性がありますが、応答は純粋JSONです。

他の誰かがこの問題に遭遇しましたか?

4

4 に答える 4

3

Youtube(この回答の時点で)oembedはリクエストでJSONPをサポートしていないため、返されるものは正しいです...しかし、それは必要なものではありません。JSONP呼び出しに必要なものは次のようになります。

functionName({
    "provider_url": "http:\/\/www.youtube.com\/",
    "title": "Coder Girl",
    "html": "\u003cobject width=\"425\" height=\"344\"\u003e\u003cparam name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/B-m6JDYRFvk?version=3\"\u003e\u003c\/param\u003e\u003cparam name=\"allowFullScreen\" value=\"true\"\u003e\u003c\/param\u003e\u003cparam name=\"allowscriptaccess\" value=\"always\"\u003e\u003c\/param\u003e\u003cembed src=\"http:\/\/www.youtube.com\/v\/B-m6JDYRFvk?version=3\" type=\"application\/x-shockwave-flash\" width=\"425\" height=\"344\" allowscriptaccess=\"always\" allowfullscreen=\"true\"\u003e\u003c\/embed\u003e\u003c\/object\u003e",
    "author_name": "dalechase",
    "height": 344,
    "thumbnail_width": 480,
    "width": 425,
    "version": "1.0",
    "author_url": "http:\/\/www.youtube.com\/user\/dalechase",
    "provider_name": "YouTube",
    "thumbnail_url": "http:\/\/i3.ytimg.com\/vi\/B-m6JDYRFvk\/hqdefault.jpg",
    "type": "video",
    "thumbnail_height": 360
});

...現在戻ってくるものは有効なJavaScriptではないため(それ自体で、それがJSONPの動作方法であるため)、応答は実際には実行可能なJavaScriptである必要があります。

<script>そのコードをページのブロックに直接配置するだけで同じエラーが発生する可能性があります(デモはこちらをご覧ください)。


何をしようとしているのか正確にはわかりませんが、埋め込み部分の直後にいる場合は、jQuery-oembedのようなプラグインをお勧めします。データを取得している場合は、JSONを処理するためにサーバー上に何かが必要になります。その後、サーバーからデータを取得します。

于 2011-07-03T11:25:09.590 に答える
1

バージョン1.5以降、jQueryでJSONPを使用する必要はなくなりました。$ .ajax()を試して、crossDomain:trueを設定し、すべての?callbackラッパーを削除して、機能するかどうかを確認します。これははるかに信頼性の高い方法であり、構文ははるかにクリーンです。

于 2011-07-03T06:50:15.640 に答える
0

おそらく、より良い代替策は、クロスドメイン呼び出しを、呼び出しを実行する独自のサーバーで実行されているWebサービスへの呼び出しに置き換えることです。私の推測では、Chromeはクロスドメインリクエストをブロックしています。

于 2011-07-03T11:11:41.247 に答える
0

結果を文字列化するとうまくいきます。

$.getJSON('your_url_here', function(data) {
    console.log(data);  //"Object { Json content }"
    var jsonString = JSON.stringify(data);  //"{ Json content }", the "Object" literal is removed.
    var parsed = JSON.parse(jsonString); //Parse should work now.
});
于 2013-12-26T01:08:10.450 に答える