jQuery.ajax () + пустой объект JSON = ошибка разбора - PullRequest
15 голосов
/ 06 апреля 2009

Я получаю ошибку разбора при использовании 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 = 200
textStatus: parsererror
errorThrown: undefined

Это относится ко всем ранее упомянутым объектам.

Ответы [ 8 ]

9 голосов
/ 07 марта 2014

Решение состоит в том, чтобы вернуть код состояния 204, а не 200 с сервера, 204 - «нет содержимого», и он вернет успех, не пытаясь вызвать синтаксический анализатор

5 голосов
/ 06 апреля 2009

Во-первых, {[]}, {[null]} и {null} не будут работать, поскольку все они являются недопустимыми объектами JSON (как проверено валидатором JSON ).

Все остальные объекты являются допустимыми объектами JSON, поэтому должна вызываться ваша функция success.

Если вы передаете объект, не являющийся массивом или подобным массиву, то функция each перечислит ваш объект json по его именованным свойствам. В случае ваших трех объектов, каждый из которых имеет rows свойство this, будет установлено значение [], null и {} соответственно, ни один из которых не имеет атрибута columnName, поэтому неопределенная ошибка будет быть брошенным.

С другой стороны, ваш {} объект не имеет свойств, поэтому не должен вызывать ошибку, потому что вызов each будет повторяться 0 раз. Что показывает следующая строка, если вы добавите ее в качестве первой строки в вашей функции success?

alert(typeof json + ' ' + (json == null));
2 голосов
/ 27 апреля 2010

Ваш веб-сервис может возвращать ноль. Я обнаружил, что возвращение нулевого значения из вызова веб-службы возвращает ответ с кодом состояния 200 «ОК», но впоследствии jQuery выдает ошибку синтаксического анализа.

Если это так, то это не имеет никакого отношения к тому, что вы отправляете на сервер, и ко всему, что отправляет сервер обратно.

Если вы можете изменить веб-службу, вы можете попытаться вернуть пустой объект JSON или значение по умолчанию вместо Null. Кроме того, вы можете проверить этот сценарий ошибки в своем обработчике ошибок, зная, что это означает, что ваш вызов возвратил ноль.

2 голосов
/ 06 апреля 2009

Вы ищете это:

[]

пустой массив. То есть, если вы планируете сразу выполнить итерацию, то вам нужен массив.

1 голос
/ 06 апреля 2009

Вы проверяли, правильно ли возвращается JSON в первую очередь перед каждым? Установите пустое значение как {} и убедитесь, что оно такое до .each

Также было бы полезно узнать, как выглядит ваш JSON при наличии данных.

1 голос
/ 06 апреля 2009

Вместо:

$(json).each(function () { ... });

Я думаю, вы хотите использовать:

$.each(json, function () { ... });

Из jQuery.each документации :

Эта функция не совпадает с $ (). Each () - который используется для итерации, исключительно через объект jQuery. Эта функция может быть использована для итерации по всему.

0 голосов
/ 18 сентября 2013

У меня тоже была эта проблема, и она была решена с помощью jsonserializer в моем веб-сервисе для форматирования пустой строки. результат был "\" \ "" по существу "" ;

0 голосов
/ 23 июня 2011

У меня возникли похожие проблемы при запросе действительного JSON с сервера.

Мой сервер обслуживал тип контента text / javascript

Я не использовал необязательный параметр jQuery.ajax для dataType, поэтому jQuery интерпретировал вывод javascript (например, дополненный JSON), а не чистый JSON.

Добавление dataType: 'JSON' к объекту настроек, переданному в метод jjuery ajax, решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...