写点什么

SDK 兼容 JSON

发布于: 2021 年 03 月 16 日

最近在集成融云 SDK,于是看了下融云的 SDK 源码,发现源码中有一段针对 JSON 的适配,由于针对 IE9 以下不支持 JSON 对象的处理方式,在此分享下


1、优点: 除中文外的字符都会转为 Unicode 。


2、缺点:JSON.parse() 使用 eval 进行转换的,这个方法不是很安全,还看到人介绍用 new Function ,但是没有测试,这里暂时标记下,有空测试下。


if (!window["JSON"]) {
复制代码


window["JSON"] = (function () {
复制代码


    function JSON() {
复制代码


    }
复制代码


    JSON.parse = function (sJSON) {
复制代码


        return eval('(' + sJSON + ')');
复制代码


    };
复制代码


    JSON.stringify = function (value) {
复制代码


        return this.str("", { "": value });
复制代码


    };
复制代码


    JSON.str = function (key, holder) {
复制代码


        var i, k, v, length, mind = "", partial, value = holder[key], me = this;
复制代码


        if (value && typeof value === "object" && typeof value.toJSON === "function") {
复制代码


            value = value.toJSON(key);
复制代码


        }
复制代码


        switch (typeof value) {
复制代码


            case "string":
复制代码


                return me.quote(value);
复制代码


            case "number":
复制代码


                return isFinite(value) ? String(value) : "null";
复制代码


            case "boolean":
复制代码


            case "null":
复制代码


                return String(value);
复制代码


            case "object":
复制代码


                if (!value) {
复制代码


                    return "null";
复制代码


                }
复制代码


                partial = [];
复制代码


                if (Object.prototype.toString.apply(value) === "[object Array]") {
复制代码


                    length = value.length;
复制代码


                    for (i = 0; i < length; i += 1) {
复制代码


                        partial[i] = me.str(i, value) || "null";
复制代码


                    }
复制代码


                    v = partial.length === 0 ? "[]" : "[" + partial.join(",") + "]";
复制代码


                    return v;
复制代码


                }
复制代码


                for (k in value) {
复制代码


                    if (Object.prototype.hasOwnProperty.call(value, k)) {
复制代码


                        v = me.str(k, value);
复制代码


                        if (v) {
复制代码


                            partial.push(me.quote(k) + ":" + v);
复制代码


                        }
复制代码


                    }
复制代码


                }
复制代码


                v = partial.length === 0 ? "{}" : "{" + partial.join(",") + "}";
复制代码


                return v;
复制代码


        }
复制代码


    };
复制代码


    JSON.quote = function (string) {
复制代码


        var me = this;
复制代码


        me.rx_escapable.lastIndex = 0;
复制代码


        return me.rx_escapable.test(string) ? '"' + string.replace(me.rx_escapable, function (a) {
复制代码


            var c = me.meta[a];
复制代码


            return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
复制代码


        }) + '"' : '"' + string + '"';
复制代码


    };
复制代码


    JSON.rx_escapable = new RegExp('[\\\"\\\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]', "g");
复制代码


    JSON.meta = {
复制代码


        "\b": "\\b",
复制代码


        "    ": "\\t",
复制代码


        "\n": "\\n",
复制代码


        "\f": "\\f",
复制代码


        "\r": "\\r",
复制代码


        '"': '\\"',
复制代码


        "''": "\\''",
复制代码


        "\\": "\\\\"
复制代码


    };
复制代码


    return JSON;
复制代码


})();
复制代码


}
复制代码

看到这段代码,觉得融云 SDK 在兼容性上还是有处理的,又在 IE7 下做了测试,果然可以稳定运行(这年头还有 IE7 ,是不是很神奇)


融云官网:https://www.rongcloud.cn


融云文档:https://docs.rongcloud.cn/v4


用户头像

还未添加个人签名 2021.01.26 加入

还未添加个人简介

评论

发布
暂无评论
SDK 兼容 JSON