繁体   English   中英

如何让jquery.Ajax与“throw 1; <不要是邪恶的>“在json回应面前?

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

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

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呼叫,并在运行中进行必要的转换/替换。 它基本上将你的对象读作“text”,替换不可解析的cruft,并吐出一个新的json对象。

效果很好。 我设置它并忘记它并且它不会干扰任何没有污染的json。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM