jQuery возвращает "parsererror" для запроса ajax

получал "parsererror" от jquery для запроса Ajax, я попытался изменить сообщение на GET, возвращая данные несколькими различными способами (создание классов и т. д.) но я не могу понять, в чем проблема.

мой проект находится в MVC3, и я использую jQuery 1.5 У меня есть раскрывающийся список, и в событии onchange я запускаю вызов, чтобы получить некоторые данные на основе того, что было выбрано.

выпадающий список: (это загружает "представления" из списка в Viewbag и стрельбы мероприятие отлично работает)

@{
    var viewHtmls = new Dictionary<string, object>();
    viewHtmls.Add("data-bind", "value: ViewID");
    viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()");
}
@Html.DropDownList("view", (List<SelectListItem>)ViewBag.Views, viewHtmls)

Javascript:

this.LoadViewContentNames = function () {
    $.ajax({
        url: '/Admin/Ajax/GetViewContentNames',
        type: 'POST',
        dataType: 'json',
        data: { viewID: $("#view").val() },
        success: function (data) {
            alert(data);
        },
        error: function (data) {
            debugger;
            alert("Error");
        }
    });
};

приведенный выше код успешно вызывает метод MVC и возвращает:

[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
 {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]

но jquery запускает событие ошибки для $.метод ajax (), говорящий "parsererror".

14 ответов


Я недавно сталкивался с этой проблемой и наткнулся на этот вопрос.

я решил это гораздо более простым способом.

Способ Один

вы можете либо удалить dataType: 'json' свойство из литерала объекта...

Способ

или вы можете сделать то, что @Sagiv говорил, вернув свои данные как Json.

причина parserror сообщение происходит, когда вы просто вернуть строке или другое значение, это не реально Json, поэтому синтаксический анализатор не работает при его анализе.

Итак, если вы удалите dataType: json собственность, он не будет пытаться разобрать его как Json.

С другим методом, если вы обязательно вернете свои данные как Json парсер будет знать, как правильно ее обрабатывать.


посмотреть ответ @david-east для правильного способа справиться с проблемой

этот ответ имеет отношение только к ошибка с jQuery 1.5 при использовании файла: протокол.

недавно у меня была аналогичная проблема при обновлении до jQuery 1.5. Несмотря на получение правильного ответа обработчик ошибок уволен. Я решил это, используя complete событие, а затем проверка значения состояния. е.г:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}

вы указали ответ вызова ajax тип as:

'json'

где как фактический ответ ajax не является допустимым JSON, и в результате парсер JSON выдает ошибку.

лучший подход, который я бы порекомендовал изменить тип в:

'text'

и в успешном обратном вызове проверьте, возвращается ли допустимый JSON или нет, и если проверка JSON терпит неудачу, предупредите его на экране, чтобы было очевидно, с какой целью вызов ajax на самом деле терпит неудачу. Взгляните на это:

$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    dataType: 'text',
    data: {viewID: $("#view").val()},
    success: function (data) {
        try {
            var output = JSON.parse(data);
            alert(output);
        } catch (e) {
            alert("Output is not valid JSON: " + data);
        }
    }, error: function (request, error) {
        alert("AJAX Call Error: " + error);
    }
});

проблема в том, что ваш контроллер возвращает строку или другой объект, который не может быть проанализирован. вызов ajax ожидал получить JSON взамен. попробуйте вернуть JsonResult в контроллере так:

 public JsonResult YourAction()
    {
        ...return Json(YourReturnObject);

    }

надеюсь, что это помогает :)


ваши данные JSON могут быть неправильными. http://jsonformatter.curiousconcept.com/ чтобы проверить его.


есть много предложений снять

dataType: "json"

хотя я допускаю, что это работает, он игнорирует основную проблему. Если вы уверены, что возвращаемая строка действительно является JSON, то найдите блуждающие пробелы в начале ответа. Подумайте о том, чтобы взглянуть на него в fiddler. Моя выглядела так:--4-->

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":".\/output\/ou...

в моем случае это была проблема с PHP, извергающим нежелательные символы (в этом случае UTF-файл BOMs). Как только я удалил их, это исправило проблему, пока также сохраняя

dataType: json

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


Я не знаю, если это все еще актуально, но проблема была с кодированием. Переход на ANSI решил проблему для меня.


Если вы получаете эту проблему с помощью HTTP GET in IE, я решил эту проблему, установив кэш: false. Поскольку я использовал один и тот же url для запросов HTML и JSON, он попал в кэш вместо вызова json.

$.ajax({
    url: '/Test/Something/',
    type: 'GET',
    dataType: 'json',
    cache: false,
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
});

вы должны удалить тип данных: "json". Тогда посмотри на магию... причина этого заключается в том, что вы конвертируете объект json в простую строку.. поэтому парсер JSON не смогла разобрать эту строку с JSON-объект.

this.LoadViewContentNames = function () {
$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
 });
};

в случае операции Get из web .net mvc / api убедитесь, что вы разрешаете get

     return Json(data,JsonRequestBehavior.AllowGet);

Я также получал " возврат запроса с ошибкой: parsererror."в консоли JavaScript. В моем случае это не было вопросом Json, но я должен был передать в текстовую область просмотра допустимую кодировку.

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);

проблема

окно.формат JSON.синтаксический анализ вызывает ошибку в $.функция parseJSON.

<pre>
$.parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
</pre>

мое решение

перегрузка JQuery с помощью requirejs инструмент.

<pre>
define(['jquery', 'jquery.overload'], function() { 
    //Loading jquery.overload
});
</pre>

С помощью jQuery.перегрузка.содержимое файла js

<pre>
define(['jquery'],function ($) { 

    $.parseJSON: function( data ) {
        // Attempt to parse using the native JSON parser first
        /**  THIS RAISES Parsing ERROR
        if ( window.JSON && window.JSON.parse ) {
            return window.JSON.parse( data );
        }
        **/

        if ( data === null ) {
            return data;
        }

        if ( typeof data === "string" ) {

            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = $.trim( data );

            if ( data ) {
                // Make sure the incoming data is actual JSON
                // Logic borrowed from http://json.org/json2.js
                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                    .replace( rvalidtokens, "]" )
                    .replace( rvalidbraces, "")) ) {

                    return ( new Function( "return " + data ) )();
                }
            }
        }

        $.error( "Invalid JSON: " + data );
    }

    return $;

});
</pre>

если вы не хотите удалять/менять dataType: json, вы можете переопределить строгий синтаксический анализ jQuery, определив пользовательский converter:

$.ajax({
    // We're expecting a JSON response...
    dataType: 'json',

    // ...but we need to override jQuery's strict JSON parsing
    converters: {
        'text json': function(result) {
            try {
                // First try to use native browser parsing
                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {
                    return JSON.parse(result);
                } else {
                    // Fallback to jQuery's parser
                    return $.parseJSON(result);
                }
            } catch (e) {
               // Whatever you want as your alternative behavior, goes here.
               // In this example, we send a warning to the console and return 
               // an empty JS object.
               console.log("Warning: Could not parse expected JSON response.");
               return {};
            }
        }
    },

    ...

используя это, вы можете настроить поведение, когда ответ не может быть проанализирован как JSON (даже если вы получите пустое тело ответа!)

С помощью этого пользовательского конвертера,.done()/success будет срабатывать до тех пор, пока запрос был в противном случае успешным (код ответа 1xx или 2xx).