Javascript: как определить, является ли ответ AJAX JSON - PullRequest
34 голосов
/ 02 сентября 2011

У меня есть запрос AJAX, который ожидает JSON в ответ.

Но есть вероятность, что получаемые результаты могут быть не JSON, а страницей с ошибкой HTML (к сожалению, с типом ответа 200).

Как узнать, является ли ответ JSON или нет?

(я использую jQuery, если это помогает. Но я не могу использовать какие-либо плагины.)

Ответы [ 5 ]

58 голосов
/ 02 сентября 2011

Что ж, если вы используете jQuery и указываете свойство dataType вызова $.ajax() для json, тогда jQuery попытается проанализировать JSON, а если это не JSON следует вызвать error() обратный вызов.

$.ajax({
    url: '/my/script.ext',
    dataType: 'json',
    success: function(data, textStatus, jqXHR) { /*YAYE!!*/ },
    error: function(jqXHR, textStatus, errorThrown) { /*AWWW... JSON parse error*/ }
});

EDIT

Для тех, кто не использует jQuery, который попадает сюда, основная идея состоит в том, чтобы попытаться разобрать его как json и поймать ошибку:

var data = 'some_data';

try {
    data = JSON.parse(data);
} catch(e) {
    //JSON parse error, this is not json (or JSON isn't in your browser)
}

//act here on the the parsed object in `data` (so it was json).
16 голосов
/ 02 сентября 2011

jQuery автоматически определяет dataType:

Если ответом является JSON, правильно работающее приложение установит для Content-Type значение application / json .

Таквсе, что вам нужно сделать, если сервер работает хорошо, это проверить, начинается ли заголовок Content-Type в ответе с application / json.

Случайно, jQuery уже делает это сам:

$.get('/foo', function(data, status, xhr, dataType) {
    if ('json' === dataType) {
        // Yay that's JSON !
        // Yay jQuery has already parsed `data` 
    }
});

jQuery обнаруживает dataType и передает его в качестве 4-го параметра функции обратного вызова.Если dataType - JSON, он анализирует строку JSON и анализирует результирующее значение как первый параметр обратного вызова.

4 голосов
/ 02 сентября 2011

Похоже на хорошее использование try catch:

try {
   $.parseJSON(input)
} catch(e) {
   // not valid JSON
}
3 голосов
/ 02 сентября 2011

Для этого можно использовать функцию jQuery parseJSON.Он выдаст исключение, и вы сможете его поймать.

data = '{}';
try {
    json = $.parseJSON(data);
} catch (e) {
    // not json
}
2 голосов
/ 02 сентября 2011
try {
    jQuery.parseJson(json_string_here);
} catch(e) {
   ... malformed json ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...