jQuery возвращает "parsererror" для запроса ajax
Получив "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".
19 ответов
Я недавно столкнулся с этой проблемой и наткнулся на этот вопрос.
Я решил это гораздо проще.
Способ первый
Вы можете удалить dataType: 'json'
свойство от объекта буквального...
Способ второй
Или вы можете делать то, что говорил @Sagiv, возвращая ваши данные как Json
,
Причина этого parsererror
возникает сообщение о том, что когда вы просто возвращаете строку или другое значение, это не совсем Json
, так что синтаксический анализатор терпит неудачу при синтаксическом анализе.
Так что если вы удалите dataType: json
свойство, оно не будет пытаться разобрать его как Json
,
С другим методом, если вы убедитесь, что ваши данные возвращаются как Json
синтаксический анализатор будет знать, как правильно его обрабатывать.
Смотрите ответ @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;
//...
}
}
Вы указали 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);
}
});
Проблема в том, что ваш контроллер возвращает строку или другой объект, который не может быть проанализирован. Ожидается, что вызов Ajax вернет Json. попробуйте вернуть JsonResult в контроллер следующим образом:
public JsonResult YourAction()
{
...return Json(YourReturnObject);
}
Надеюсь, поможет:)
Есть много предложений, чтобы удалить
dataType: "json"
Хотя я допускаю, что это работает, это игнорирует основную проблему. Если вы уверены, что возвращаемая строка действительно является JSON, тогда ищите ошибочные пробелы в начале ответа. Подумайте о том, чтобы взглянуть на это в Fiddler. Моя выглядела так:
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
{"type":"scan","data":{"image":".\/output\/ou...
В моем случае это была проблема с PHP, извергающим нежелательные символы (в данном случае спецификации файлов UTF). После того, как я удалил их, это решило проблему, сохраняя при этом
dataType: json
Ваши данные JSON могут быть неверными. http://jsonformatter.curiousconcept.com/ чтобы проверить это.
Убедитесь, что вы удалите любой отладочный код или что-либо еще, что может выводить непреднамеренную информацию. Несколько очевидно, но легко забыть в данный момент.
Для меня то, что устраняет проблему, заключалось в возвратеTask<JsonResult>
после сериализации:
[HttpPost, Route("GetSomeText")]
public async Task<JsonResult> GetSomeText(SomeRequest request)
{
string result = "some text";
return Json(JsonConvert.SerializeObject(result));
}
Когда вы используете тип возвращаемого значения, он должен быть Json. Вы можете использоватьcontentType: "application/json; charset=utf-8"
скорее, чемdataType: 'json'
100% правильно
Я столкнулся с той же проблемой. Для решения своей проблемы я решил использовать двойные кавычки вместо одинарных.
echo "{'error':'Sorry, your file is too large. (Keep it under 2MB)'}";
-to-
echo '{"error":"Sorry, your file is too large. (Keep it under 2MB)"}';
У меня была такая же проблема, получилось мое web.config
было не то же самое с моими партнерами по команде. Поэтому, пожалуйста, проверьте ваш web.config
,
Надеюсь, это кому-нибудь поможет.
Я также получаю "Запрос возврата с ошибкой:parsererror". в консоли JavaScript. В моем случае это был не вопрос Json, но мне пришлось передать в текстовую область просмотра действительную кодировку.
String encodedString = getEncodedString(text, encoding);
view.setTextAreaContent(encodedString);
Я столкнулся с такой ошибкой, но после изменения моего ответа перед отправкой клиенту он работал нормально.
//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
}
Я не знаю, если это все еще актуально, но проблема была с кодировкой. Переход на ANSI решил проблему для меня.
Если вы получили эту проблему, используя 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");
}
});
Вы должны удалить 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");
}
});
};
в случае операции Get из веб.net mvc/api, убедитесь, что вы можете получить
return Json(data,JsonRequestBehavior.AllowGet);
Эта проблема
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>
Если вы не хотите удалять / изменять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).