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

186

Получив «parsererror» от jquery для запроса Ajax, я попытался изменить POST на 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".

dkarzon
источник
это вызывает ошибку javascript в консоли или выполняется функция обработчика "error" команды $ .ajax ()?
arnorhs
извините, должен был быть более конкретным, он запускает функцию ошибки $ .ajax () {alert ("Error"); }
dkarzon
Есть ли шанс живой ссылки? Вы видите данные JSON, которые вы показываете в Firebug?
Пекка
Нет, у меня нет живой ссылки. Но да, это ответ JSON, показанный в Firebug.
dkarzon
да, моя плохая была опечатка. Исправлен вопрос
dkarzon

Ответы:

307

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

Я решил это гораздо проще.

Способ первый

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

Способ второй

Или вы можете делать то, что говорил @Sagiv, возвращая ваши данные как Json.


Причина, по которой parsererrorвозникает это сообщение, заключается в том, что когда вы просто возвращаете строку или другое значение, это на самом деле не так Json, поэтому синтаксический анализатор дает сбой при его анализе.

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

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

Дэвид Восток
источник
4
Спасибо Дэвид, Метод Один работал для меня. В моем случае я ничего не возвращал, но по ошибке использовал тип данных. Спасибо за чаевые.
Кришна Теджа Веерамачанени
Спасибо за ответ, я обновил ответ на квест, так как это кажется лучшим решением.
dkarzon
Я столкнулся с этой проблемой, когда в моем php-скрипте произошла ошибка, и он возвращал не-JSON-данные - полезное предложение dataType действительно отключить !
Шарад
Спасибо! Это относится также к jquery.fileupload.js и другим библиотекам, использующим методы JQuery AJAX. Непонятное сообщение об ошибке!
kqr
Я получаю эту проблему с помощью Rails jquery-ujs
Donato
29

Смотрите ответ @ david-east, чтобы узнать, как правильно решить эту проблему.

Этот ответ относится только к ошибке в jQuery 1.5 при использовании протокола file :.

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

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}
johnhunter
источник
1
Подтверждено исправлено в JQuery 1.5.1
johnhunter
13
У меня есть эта проблема в 1.7.2 :(
Eystein Bye
6
У меня просто была эта проблема, но я удалил тип данных: «json», и проблема была решена. Так как он не возвращает истинную форму json, он столкнется с ошибкой синтаксического анализатора.
Дэвид Ист
3
У меня есть эта проблема в 1.9.1, и я обошел ее, заставив мой API возвращать пустой хеш {}. Позор это необходимо.
Адам Таттл
4
Это на самом деле в документации: ...The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead. api.jquery.com/jQuery.ajax
Роб
17

Вы указали dataType ответа на вызов ajax как:

'JSON'

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

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

'текст'

и в обратном вызове успеха проверьте, возвращается ли верный 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);
    }
});
Надим Хан
источник
1
или удалите тип данных :)
Александр
10

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

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

    }

Надеюсь, поможет :)

Сагив Офек
источник
Извините, забыл включить мой код, но именно так возвращается Json.
dkarzon
4

Есть много предложений, чтобы удалить

dataType: "json"

Хотя я допускаю, что это работает, это игнорирует основную проблему. Если вы уверены, что возвращаемая строка действительно является JSON, тогда ищите ошибочные пробелы в начале ответа. Подумайте о том, чтобы взглянуть на это в Fiddler. Моя выглядела так:

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

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

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

dataType: json
Сэм Страчан
источник
Согласитесь с этим ... Я проверил ответ, и это была var_dump (), которая была потеряна где-то в приложении.
Чак
2

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

Jahmic
источник
0

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

Георгий Дгебуадзе
источник
0

Если вы получили эту проблему, используя HTTP GET в 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");
    }
});
Стюарт
источник
0

Вы должны удалить dataType: "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");
    }
 });
};
Дези Бойз
источник
0

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

     return Json(data,JsonRequestBehavior.AllowGet);
Mohamed.Abdo
источник
0

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

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);
Лаура Липаруло
источник
0

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

//Server side
response = JSON.stringify('{"status": {"code": 200},"result": '+ JSON.stringify(result)+'}');
res.send(response);  // Sending to client

//Client side
success: function(res, status) {
    response = JSON.parse(res); // Getting as expected
    //Do something
}
Анант Кумар Васамсетти
источник
0

У меня была та же самая проблема, оказалось, что я web.configне был тем же самым с моими товарищами по команде. Поэтому, пожалуйста, проверьте свой web.config.

Надеюсь, это кому-нибудь поможет.

Рошна Омер
источник
-1

Эта проблема

window.JSON.parse вызывает ошибку в функции $ .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.overload.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>
Кристиан Мерур
источник
-1

Если вы не хотите удалять / изменять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).

alexw
источник