it-roy-ru.com

AJAX вызовите и очистите JSON, но синтаксическая ошибка: отсутствует; до заявления

Я делаю междоменный вызов JSONP, используя этот код:

jQuery.ajax({
        async: true,
        url: 'http://mnews.hostoi.com/test.json',
        dataType: 'jsonp',
        method: "GET",
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(textStatus + ': ' + errorThrown);
        },
        success: function (data, textStatus, jqXHR) {
            if (data.Error || data.Response) {
                exists = 0;
            }
        }
    });

При отладке в Firebug я получаю следующую ошибку:

enter image description here

SyntaxError: missing ; before statement

Однако, когда я передаю свой объект json (доступный по ссылке в коде JQ) через такой инструмент, как jsonlint.com, он говорит, что это действительный JSON. И я не нахожу никаких аномалий. Как это может быть возвращение синтаксической ошибки? Это какая-то деталь JSONP, которую я не получаю или что?

Образец JSON

{"news":[ {
  "sentences": [
    "Neuroscientists have discovered abnormal neural activity...", 
    "The researchers found that these mice showed many symptoms...", 
    "\"Therefore,\" the study authors say, \"our findings provide a novel.."
  ], 
  "summaryId": "ZJEmY5", 
  "title": "Abnormal neural activity linked to schizophrenia"
}]}

Заранее спасибо.

42
JZweige

JSONP - это не JSON. Ответ JSONP будет состоять из сценария JavaScript, содержащего только вызов функции (предварительно определенной функции) с одним аргументом (который является литералом объекта JavaScript, соответствующим синтаксису JSON).

Ответ, который вы получаете, - JSON, а не JSONP, поэтому ваши попытки обработать его как JSONP потерпят неудачу.

Измените dataType: 'jsonp' на dataType: 'json' (или полностью удалите строку, сервер выдает правильный тип содержимого, поэтому вам не нужно его переопределять).

Поскольку ваш сценарий выполняется в другом источнике, отличном от JSON, вам также потребуется предпринять шаги (большинство, но не все, из которых требуется, чтобы вы управляли хостом, обслуживающим JSON), чтобы обойти то же самое Политика происхождения .

29
Quentin

Ошибка в том, что он возвращает JSON, а не JSONP.

JSONP должен выглядеть так

someCallBackString({ The Object });
7
epascarello

Вот рабочий пример

$.ajax({
 type: 'GET',
 url: 'http://xxx.amazonaws.com/file.json',
 dataType: 'jsonp',
 jsonpCallback: 'callback',
 success: function(json){
   console.log(json);
 }
});

И вы должны поместить callback в начало вашего file.json как:

callback({"item":{".......

4
whitesiroi

Как указал epascarello , ответ JSONP должен быть отправлен следующим образом:

callBackFunction({ JSON Object })

И функция вызывающего абонента может быть настроена так:

var url =  "http://someremoteurl.com/json";
    $.getJSON(url + "?callback=?", null, function(data) {
    callBackFunction(data);
});

Затем вы можете зациклить данные ответа как:

function callBackFunction(data)
{
   console.log(data);
}
2
shasi kanth

Если вы используете параметр " callback =? ", ваш ответ на стороне сервера должен выглядеть следующим образом:

$_callback = $_GET['callback'];    
echo $_callback . '(' . json_encode(YOUR_VARIABLE) . ');';

Если параметр " callback =? " не определен, ваш ответ должен выглядеть следующим образом:

echo '[' . json_encode($_return_array) . ']';
1
Andrew Bursov

Если вопрос связан с Ruby, то в вашем контроллере убедитесь, что вы правильно отображаете формат. пример:

def view_product
   data = Product.find params[:id]
   render :json =>  data, :callback => params[:callback]
end

В вашем методе рендеринга у вас должен быть параметр: callback , иначе он будет рендериться в json вместо jsonp.

0
Arman Ortega