jQuery.getJSON вызывает "Uncaught SyntaxError: Неожиданный токен:" для youtube oembed

Вот что я пытаюсь сделать:

$.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 : (Хром). Похоже, что проблема может быть связана с экранированием прямой косой черты, или, возможно, jQuery отправляет JSONP запрос, но ответ чистый JSON,

Кто-нибудь еще сталкивался с этой проблемой?

4 ответа

Решение

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, а затем получить данные с вашего сервера.

Вам больше не нужно использовать JSONP с jQuery начиная с версии 1.5. Попробуйте $.ajax() и установите crossDomain:true и удалите все ваши обертки? Callback и посмотрите, работает ли он. Это гораздо более надежный метод, а синтаксис намного чище.

Stringify результат работает для меня.

$.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.
});

Возможно, лучшей альтернативой было бы заменить ваш междоменный вызов вызовом веб-службы, работающей на вашем собственном сервере, который выполняет вызов для вас. Я предполагаю, что Chrome блокирует междоменный запрос.

Другие вопросы по тегам