重载jQuery的ajax方法解决JSON解析的问题

当服务器返回的JSON字符串中包含回车符等特殊字符时,ajax的解析会报错,导致程序执行异常。

为了解决这个问题,在不侵入任何代码的情况下,只能替换 jQuery ajax 的方法实现了。

将下面的代码复制到公共js的顶部,确保在发送网络请求之前就已经执行了替换操作,这样我们就能自定义解析服务器返回的JSON数据了。

$(() => {
    // Make sure the replacement operation is only performed once.
    if (window._isReplacedAjaxImp) return;
    window._isReplacedAjaxImp = true;

    const replaceAjaxImp = ($) => {
        // Convert string to JSON object (if success).
        const convertToJSON = (jsonText) => {
            let result = null;
            try {
                result = JSON.parse(jsonText);
            } catch (e) {
                try {
                    result = JSON.parse(jsonText.replace(/(\r\n|\r|\n)/g, ''));
                } catch (e) {}
            }
            return result || jsonText;
        };

        // Reference to the original jQuery ajax function
        const originalAjax = $.ajax;

        // Override jQuery ajax function
        $.ajax = function() {
            // Note: `arguments` cannot be used in arrow functions
            let options = arguments[0];
            if (typeof options === 'object' && options != null) {
                const isJsonFormat = Reflect.has(options, 'dataType') && Reflect.get(options, 'dataType').toString().toLocaleLowerCase() == 'json';
                const originalSuccessFunc = Reflect.get(options, 'success');
                if (isJsonFormat && typeof originalSuccessFunc === 'function') {
                    // Custom parsing JSON
                    Reflect.set(options, 'dataType', 'text');
                    Reflect.set(options, 'success', function(data, textStatus, xhr) {
                        if (arguments.length) {
                            const resp = arguments[0];
                            arguments[0] = convertToJSON(resp);
                        }
                        originalSuccessFunc.apply(this, arguments);
                    });
                }
            }
            // Call original ajax function
            originalAjax.apply($, arguments);
        };
    };

    replaceAjaxImp(jQuery);
});