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).