Как заставить jquery.Ajax работать с «throw 1; <dont be evil>» перед ответами json? - PullRequest
3 голосов
/ 17 февраля 2012

Google возвращает Непарсируемый Cuft к ответу json , например:

throw 1; <dont be evil> { foo: bar}
  • Мои текущие веб-приложения используют jQuery.Ajax для извлечения данных JSON. Как их изменить, чтобы они использовали действительные данные?

Вот соответствующее демо

Ответы [ 2 ]

5 голосов
/ 18 февраля 2012

Вы, вероятно, должны удалить начальную часть из ответа:

$.ajax(url, {
    dataType: "jsonp text",
    success: function(data) {
        var jsonString = data.replace(/^throw 1; <dont be evil> /, "");
        var responseObject = $.parseJSON(jsonString);

        // do something with responseObject
        ...
    }
}


UPDATE:

Чтобы сделать перезапись доступной для каждого вызова Ajax, вы также можете зарегистрировать глобальный Ajax Converter в jQuery:

$.ajaxSetup({
    converters: {
        "text cleanedjson": function(data) {
            var jsonString = data.replace(/^throw 1; <dont be evil> /, "");
            return $.parseJSON(jsonString);
        }
    }
});

$.ajax(url, {
    dataType: "jsonp cleanedjson",
    success: function(responseObject) {
        // do something with responseObject
        ...
    }
});

Вам все равно нужно будет указать ваш определенный dataType в параметрах запроса.


ОБНОВЛЕНИЕ 2: Если вам нужно настроить существующие вызовы для автоматической очистки ответа, вы можете установить реализацию jQuery ajax, чтобы автоматически использовать конвертер в определенных ситуациях:

// store reference to original implementation
$._ajax_original = $.ajax;

// redefine jQuery's ajax function
$.ajax = function(url, settings) {
    if (… your test for applicability here (e.g. an url check) …) {
        settings.dataType = "jsonp cleanedjson";
    }
    return $._ajax_original(url, settings);
};

Обратите внимание, что это переопределение должно быть включено после загрузки jQuery и перед первым вызовом Ajax. Вам также может понадобиться учесть, что $.ajax также можно вызывать без отдельного url параметра ...

2 голосов
/ 26 января 2013

Я добился этого немного проще, воспользовавшись методом $.ajaxSetup:

http://api.jquery.com/jQuery.ajaxSetup/

и используя конвертеры:

$.ajaxSetup({
    converters: {
        "text json": function (stringData) {
            return jQuery.parseJSON(stringData.replace("for(;;);", ""));
        }
    }
});

Что это делаетподключайтесь к каждому вызову Ajax и выполняйте необходимые преобразования / замены на лету.По сути, он берет ваш объект, который он читает как «текст», заменяет непарсируемую букву и выплевывает новый объект json.

Отлично работает.Я установил это и забыл это, и это не будет мешать любому не испорченному json.

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