这两天遇到json和string互转的问题,网上各种说法不一;更重要的是,有些方法会有浏览器差异。
JSON.parse()和JSON.stringify()不支持ie(网上说支持ie8以上,但我用ie8和ie9试了,都不行)
经过总结各种方法,亲身试验,得出结论如下:(下载代码示例)
string -> json
// 1 eval方法 // ie 6、7、8、9, firefox, chrome var strToJson_eval = function(str){ return eval('(' + str + ')'); } // 2 new Function方法 // ie 6、7、8、9, firefox, chrome var strToJson_function = function(str){ return (new Function("return " + str))(); } // 3 使用jQuery的jQuery.parseJSON()函数 // ie 6、7、8、9, firefox, chrome var strToJson_jquery = function(str){ return $.parseJSON(str); } // 4 使用全局的JSON对象 // firefox, chrome var strToJson_parse = function(str){ return JSON.parse(str); }
经测试,JSON.parse()方法效率最高,从效率高到低排序:
JSON.parse > $.parseJSON() > new Function() > eval
json -> string
// 1 字符串拼接 // ie 6、7、8、9, firefox, chrome var jsonToStr_function = function(obj){ switch(typeof(obj)) { case 'object': var ret = []; if (obj instanceof Array) { for (var i = 0, len = obj.length; i < len; i++) { ret.push(jsonToStr_function(obj[i])); } return '[' + ret.join(',') + ']'; } else if (obj instanceof RegExp) { return obj.toString(); } else { for (var a in obj) { ret.push(a + ':' + jsonToStr_function(obj[a])); } return '{' + ret.join(',') + '}'; } case 'function': return 'function() {}'; case 'number': return obj.toString(); case 'string': return "/"" + obj.replace(/(//|/")/g, "//$1").replace(//n|/r|/t/g, function(a) {return ("/n"==a)?"//n":("/r"==a)?"//r":("/t"==a)?"//t":"";}) + "/""; case 'boolean': return obj.toString(); default: return obj.toString(); } } // 2 JSON.stringify()函数 // firefox, chrome var jsonToStr_stringify = function(json){ return JSON.stringify(json); }