Ответ 1
Решение состоит в том, чтобы вернуть код статуса 204, а не 200 с сервера, 204 - это "нет содержимого", и он вернет успех, не пытаясь вызвать парсер
Я получаю ошибку синтаксического анализа при использовании jQuery для загрузки некоторых данных JSON. Вот фрагмент моего кода:
jQuery.ajax({
dataType: "json",
success: function (json)
{
jQuery.each(json, function ()
{
alert(this["columnName"]);
});
}
});
Я не получаю ошибок при анализе непустого объекта JSON. Поэтому я предполагаю, что проблема связана с моим сериализатором.
Вопрос: как я могу форматировать пустой объект JSON, который jQuery не считает неправильным?
Это то, что я пробовал до сих пор, без успеха:
{[]}
{[null]}
{}
{null}
{"rows": []}
{"rows": null}
{"rows": {}}
UPDATE:
Я могу понять, что я был несколько расплывчатым - позвольте мне попытаться прояснить:
Анализ JSON-объекта здесь не является проблемой - JQuery - я думаю.
jQuery выдает синтаксический анализ (вызывает функцию ошибки). Кажется, что внутренняя JSON-проверка jQuery не принимает ни один из ранее упомянутых объектов. Даже действительные.
Вывод функции ошибки:
XMLHttpRequest:
XMLHttpRequest readyState = 4 status = 200textStatus:
parsererrorerrorThrown:
undefined
Это относится ко всем ранее указанным объектам.
Решение состоит в том, чтобы вернуть код статуса 204, а не 200 с сервера, 204 - это "нет содержимого", и он вернет успех, не пытаясь вызвать парсер
Во-первых, {[]}
, {[null]}
и {null}
не будут работать, потому что все они являются недопустимыми объектами JSON (как проверено JSON validator).
Остальные объекты - все допустимые объекты JSON, поэтому ваша функция success
должна быть вызвана.
Если вы передаете объект, не похожий на массив или массив, то функция each
будет перечислять ваш объект json
по его именованным свойствам. В случае трех объектов, каждый из которых имеет свойство rows
this
, будет установлен в []
, null
и {}
соответственно, ни один из которых не имеет атрибута columnName
, поэтому undefined ошибка будет сброшена.
Ваш объект {}
, с другой стороны, не имеет свойств, поэтому не должен вызывать ошибку, потому что вызов each
будет зацикливаться 0 раз. Что отображает следующая строка, если вы добавите ее в качестве первой строки в вашей функции success
?
alert(typeof json + ' ' + (json == null));
вы ищете:
[]
пустой массив. То есть, если вы планируете последовательно перебирать его, то вам нужен массив.
Ваш веб-сервис может возвращать null. Я обнаружил, что возврат null из вызова веб-службы возвращает ответ с кодом состояния 200, "Ok", но jQuery впоследствии выдает parseerror.
Если это так, это не имеет никакого отношения к тому, что вы отправляете на сервер, и всему, что отправляет сервер.
Если вы можете изменить веб-службу, вы можете попробовать вернуть пустой объект JSON или значение по умолчанию вместо Null. Кроме того, вы можете проверить этот сценарий ошибки в своем обработчике ошибок, зная, что это означает, что ваш вызов вернулся null.
Вместо:
$(json).each(function () { ... });
Я думаю, вы хотите использовать:
$.each(json, function () { ... });
Эта функция не такая, как $(). each() - который используется для итерации, исключительно, над объектом jQuery. Эта функция может использоваться для повторения над чем-либо.
Вы проверили, правильно ли возвращен JSON в первую очередь перед каждым? Задайте пустое значение как {} и убедитесь, что оно похоже на .each
Также это поможет узнать, как выглядит ваш JSON, когда есть данные.
У меня возникали подобные проблемы при запросе действительного JSON с сервера.
Мой сервер обслуживал контент-тип текста /javascript
Я не использовал необязательный параметр jQuery.ajax 'dataType', поэтому jQuery интерпретировал вывод javascript (например, дополненный JSON), а не аккуратный JSON.
Добавление dataType: "JSON" к объекту настроек, переданному в jQuery, метод ajax решил проблему.
Если бы эта проблема была решена и была решена с помощью jsonserializer в моей веб-службе для форматирования пустой строки. результат был "\" \ " существенно " ;