jQuery.parseJSON - Chrome и Safari автоматически анализируют JSON - PullRequest
8 голосов
/ 21 июня 2011

Следующая функция приводит к тому, что в Chrome и Safari переменная ответа равна нулю, но не Firefox.

function updatePage(response){ // This argument differs by browser

    response = jQuery.parseJSON(response);

    for(var i=0; i<response.length; i++){
        // conduct magic
    };

};

Ошибка:

Uncaught TypeError: Cannot read property 'length' of null

Это происходит потому, что подача jQuery.parseJSON ()все, кроме JSON string , возвращает ноль.Похоже, что Chrome и Safari автоматически анализируют JSON без явного запроса.Если я протестирую аргумент «response» перед тем, как попытаться проанализировать его с помощью jQuery, это уже объект JSON в Chrome и Safari.Тем не менее, в Firefox это по-прежнему строка.

Единственное решение, которое я нашел, чтобы справиться с этим во всех браузерах, это определить, был ли уже проанализирован «отклик», проверив его конструктор:

function updatePage(response){

    if(response.constructor === String){
        response = jQuery.parseJSON(response);
    };

    for(var i=0; i<response.length; i++){
        // conduct magic
    };

};

Я что-то упустил или это единственный способ справиться с этим в настоящее время?Похоже, jQuery.parseJSON обнаружит пользовательский агент и просто вернет аргумент как есть в случае Chrome / Safari.

Соответствующая информация

  • Это jQuery 1.6.1
  • Тип содержимого ответа с сервера: application / json
  • Аргумент ответа исходит из вашего стандартного вызова jQuery AJAX:

$.ajax({
    url: API_URL + queryString + '&limit=' + limit,
    type: 'GET',
    cache: false,
    context: document.body,
    success: updatePage,
    error: function(err){
        console.log('ERROR: ' + err);
    }
});

1 Ответ

15 голосов
/ 21 июня 2011

Это не Chrome или Safari, это jQuery, который выполняет синтаксический анализ, если он видит соответствующий Content-Type в ответе.(Обновление: и Content-Type, который вы добавили в вопрос, верны.) Я не могу сразу понять, почему он не будет делать это в Firefox.

Вы можете заставить его всегда делатьпарсинг путем добавления dataType: 'json' к вашему звонку, подробности в jQuery.ajax документах .Тогда вы вообще не будете вызывать parseJSON, response уже будет десериализованным объектом.

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