解决ie6、ie7没有原生js对象转JSON字符串的问题
JSON1.stringify1 使用函数递归调用方式,操作的js对象受限于浏览器的堆栈大小(大概几千或一万)
JSON1.stringify2 使用数组栈方式,速度快,不受限于浏览器的堆栈大小,受限于数组的大小(可忽略)
?
和原生JSON.stringify的区别:
- 保留了undefined的值(无法兼容后台java等不支持undefined的语言)
- 未支持replacer等后续参数
- 未支持对象的toJSON方法,只支持基本的undefined、null、number、string、boolean类型,以及包含这些类型的数组和键值对对象
?
var JSON1 = {
stringify2 : function (jsObj) { //使用数组栈方式
var stack1 = [];
var stack2 = [];
var process = function(obj){
if(obj && typeof obj == "object"){
return obj;
}else if(typeof obj == "string"){
return "\"" + obj.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"";
}else{
return obj + "";
}
}
stack1.push(process(jsObj));
while(stack1.length){
var o = stack1.pop();
if(typeof o == "object"){
/*
var isArray = o instanceof Array;
stack1.push(isArray ? "[" : "{");
var i = null;
if(isArray){
for(i = 0; i < o.length; i++){
stack1.push(process(o[i]));
stack1.push(",");
}
}else{
for(i in o){
stack1.push("\"" + i + "\":");
stack1.push(process(o[i]));
stack1.push(",");
}
}
if(i){//移除最后一个无效的逗号[,]
stack1.pop();
}
stack1.push(isArray ? "]" : "}");
*/
var i = null;//必须显示的设置为null,防止空对象时保留了上一次循环的结果
if(o instanceof Array){
stack1.push("[");
for(i = 0; i < o.length; i++){
stack1.push(process(o[i]));
stack1.push(",");
}
if(i){//移除最后一个无效的逗号[,]
stack1.pop();
}
stack1.push("]");
}else{
stack1.push("{");
for(i in o){
stack1.push("\"" + i + "\":");
stack1.push(process(o[i]));
stack1.push(",");
}
if(i){//移除最后一个无效的逗号[,]
stack1.pop();
}
stack1.push("}");
}
}else{//字符串(已经处理)
stack2.unshift(o);
}
}
return stack2.join("");
},
stringify1 : function (jsonObj) { //使用函数递归调用的方法
var jsonBuffer = [];
var type = typeof jsonObj;//undefined,boolean,number,string,object
if(type === "object"){
if(jsonObj === null){
jsonBuffer.push(jsonObj + "");
}else{
if(jsonObj instanceof Array){
jsonBuffer.push("[");
for(var i = 0; i < jsonObj.length; i++){
jsonBuffer.push(JSON1.stringify1(jsonObj[i]));
jsonBuffer.push(",");
}
if(i){
jsonBuffer.pop();//移除最后一个无效的逗号[,]
}
jsonBuffer.push("]");
}else{
jsonBuffer.push("{");
for(var j in jsonObj){
jsonBuffer.push("\"" + j + "\":" + JSON1.stringify1(jsonObj[j]));
jsonBuffer.push(",");
}
if(j){
jsonBuffer.pop();//移除最后一个无效的逗号[,]
}
jsonBuffer.push("}");
}
}
}else if(type == "string"){
jsonBuffer.push("\"" + jsonObj.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"");
}else{
jsonBuffer.push(jsonObj + "");
}
return jsonBuffer.join("");
}
}
?
?
