jQuery, що повертає "parsererror" для запиту ajax


186

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

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

Спадне меню: (це завантажує "Перегляди" зі списку у "Переглядачці" та запуску події працює чудово)

@{
    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".


чи запускається помилка javascript у консолі чи виконується функція обробника "помилки" команди $ .ajax ()?
arnorhs

Вибачте, мав бути більш конкретним, він запускає функцію помилки $ .ajax () {alert ("Помилка"); }
dkarzon

Будь-який шанс на пряме посилання? Ви бачите дані JSON, які ви показуєте у Firebug?
Pekka

Ні, я не маю прямого зв'язку. Але так, це відповідь JSON, показана у Firebug.
dkarzon

так, мій поганий був друкарський помилок. Виправлено питання
dkarzon

Відповіді:


306

Нещодавно я стикався з цією проблемою і натрапив на це питання.

Я вирішив це набагато простіше.

Спосіб перший

Ви можете або видалити dataType: 'json'властивість з об'єкта буквально ...

Спосіб другий

Або ви можете зробити те, що говорив @Sagiv, повернувши свої дані як Json.


Причина, чому це parsererror виникає повідомлення, полягає в тому, що коли ви просто повертаєте рядок або інше значення, це насправді не такJson , тому аналізатор виходить з ладу під час його розбору.

Тож якщо ви видалите dataType: json властивість, він не намагатиметься розібрати його як Json.

З іншим методом, якщо ви переконайтеся, що повертаєте свої дані як Json, аналізатор буде знати, як правильно з ними поводитися.


4
Дякую, Девід, метод перший працював на мене. У моєму випадку я не повертав нічого, але помилково використовував тип даних. Дякую за пораду.
Krishna Teja Veeramachaneni

Дякую за відповідь, я оновив відповідь на квест, оскільки це здається кращим рішенням.
dkarzon

Я зіткнувся з цією проблемою, коли в моєму php-скрипті сталася помилка, і повертався не-JSON-дані - корисна пропозиція dataType дійсно відключити !
Шарад

Дякую! Це стосується також jquery.fileupload.js та інших бібліотек, що використовують методи JQuery AJAX. Помилкове повідомлення про помилку!
kqr

Я отримую цю проблему за допомогою Rails jquery-ujs
Donato

29

Про правильний спосіб вирішення проблеми див. Відповідь @ david-east

Ця відповідь стосується лише помилки з jQuery 1.5 при використанні файлу: протокол.

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

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

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

Ви вказали тип даних відповіді на виклик Ajax як:

'json'

де фактична відповідь на ajax не є дійсною JSON, і в результаті аналізатор JSON видає помилку.

Найкращий підхід, який я рекомендую, - це змінити тип даних на:

"текст"

і в межах зворотного виклику успіху підтвердити, повертається чи ні 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 отримає Джесона у відповідь. спробуйте повернути JsonResult у контролер так:

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

    }

сподіваюся, що це допоможе :)


Вибачте, забув включити мій код позаду, але саме так повертається Json.
dkarzon


4

Є багато пропозицій, які потрібно видалити

dataType: "json"

Хоча я визнаю, що це працює, він ігнорує основну проблему. Якщо ви впевнені, що зворотний рядок дійсно є JSON, тоді на початку відповіді шукайте помилковий пробіл. Поміркуйте, як це подивитись у фіддлері. Моя виглядала так:

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

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

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

dataType: json

Погоджуйтеся з цим ... Я перевірив відповідь, і десь у додатку було втрачено var_dump ().
Чак

2

Переконайтесь, що ви видалили будь-який код налагодження чи будь-що інше, що може виводити ненавмисну ​​інформацію. Дещо очевидний, але легко забутий на даний момент.



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 parser не в змозі проаналізувати цей рядок через те, що він не є об'єктом 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

у випадку отримання операції з веб .net mvc / api, переконайтеся, що ви дозволені

     return Json(data,JsonRequestBehavior.AllowGet);

0

Я також отримував "Запити повернення з помилкою: parsererror." в консолі javascript. У моєму випадку це не стосувалося Джсона, але мені довелося передати в область перегляду тексту дійсне кодування.

  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 за допомогою інструмента Requjs .

<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 код відповіді).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.