Почему $.getJSON бесшумно терпит неудачу?

Кажется очень неудобным, что jQuery $.getJSON бесшумно терпит неудачу, когда возвращаемые данные недействительны JSON. Почему это было реализовано с бесшумной неудачей? Каков самый простой способ выполнить getJSON с улучшенным поведением (например, сбросить исключение, console.log() или что-то еще)?

Ответ 1

вы можете использовать

        function name() {
            $.getJSON("", function(d) {
                alert("success");
            }).done(function(d) {
                alert("done");
            }).fail(function(d) {
                alert("error");
            }).always(function(d) {
                alert("complete");
            });
        }

Если вы хотите увидеть причину ошибки, используйте полную версию

function name() {
    $.getJSON("", function(d) {
        alert("success");
    }).fail( function(d, textStatus, error) {
        console.error("getJSON failed, status: " + textStatus + ", error: "+error)
    });
}

Если ваш JSON не правильно сформирован, вы увидите что-то вроде

getJSON failed, status: parsererror, error: SyntaxError: JSON Parse error: Unrecognized token '/'

Если URL-адрес неверен, вы увидите что-то вроде

getJSON failed, status: error, error: Not Found

Если вы пытаетесь получить JSON из другого домена, нарушая политику одинакового происхождения, этот подход возвращает пустое сообщение. Обратите внимание, что вы можете обойти политику "один и тот же источник", используя JSONP (который имеет ограничения) или предпочтительный метод совместного использования ресурсов Cross-origin (CORS).

Ответ 2

Прямо из документации:

Важно: Как и в jQuery 1.4, если файл JSON содержит синтаксическую ошибку, запрос обычно терпит неудачу.

Как говорится на странице документации, getJSON - это просто сокращенный метод для

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback
});

Чтобы получить отказ, вы можете использовать $.ajax следующим образом:

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback,
    error: another callback
});

Ответ 3

Вместо этого вы можете использовать $.ajax и установить для параметра dataType значение "json". Из документации:

"json": оценивает ответ как JSON и возвращает объект JavaScript. В jQuery 1.4 данные JSON обрабатываются в строгий порядок; любой некорректный JSON отклонено , а ошибка синтаксического анализа выбрана. (См. Json.org для получения дополнительной информации о правильное форматирование JSON.)

Ответ 5

Если вы запрашиваете JSONP в качестве ответа, вы получите молчащий сбой, если нет ответа (например, отключение сети). Подробнее см. этот поток.