如何获取jquery.Ajax与“;投掷1<不要邪恶>"在json响应前面

How do I get jquery.Ajax to work with "throw 1; <dont be evil>" in front of json responses?

本文关键字:lt 邪恶 quot 前面 响应 json gt 投掷 获取 何获取 jquery      更新时间:2023-09-26

Google向json响应返回Unparsable Cuft,如下所示:

throw 1; <dont be evil> { foo: bar}
  • 我当前的web应用程序使用jQuery.Ajax来检索JSON数据。应该如何修改它们以使用有效数据

这是一个相关的演示

您可能应该从响应中删除开头部分:

$.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
        ...
    }
}


更新:

为了使重写在每个Ajax调用中都可用,您还可以在jQuery:中注册一个全局Ajax转换器

$.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调用之前,必须包含此重新定义。您可能还需要考虑,也可以在没有单独的url参数的情况下调用$.ajax。。。

我利用$.ajaxSetup方法简单地实现了这一点:

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

以及使用转换器:

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

这样做的目的是利用每个ajax调用,并动态进行必要的转换/替换。它本质上是将您的对象读取为"文本",替换不可解析的cruft,并吐出一个新的json对象。

效果很好。我设置了它并忘记了它,它不会干扰任何未受污染的json。