最近时常需要将对象转为字符串,网上的方法中,著名的JSONStringify只能浅层转换。另外一个朋友用prototype更改了对象的toString方法导致一些运行库运行不良。(比如在jquery下报错)由此为这个需要重新编写函数,跟大家分享。相信可以适应大部分状况了,欢迎大家帮忙测试。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>对象转换为字符串函数</title>
</head><body>
</body>
</html>
<script type="text/javascript">/*******************************************************
函数名: ToJSON
功  能: 将对象深层转换为字符串。
参  数: o : 待转换对象
返  回: 转换生成的字符串
举  例: var obj = {a:1,b:[1,2]};alert(ToJSON(obj));
*******************************************************/
function ToJSON(o){

function isNumber(obj){
return (typeof obj=='number')&&obj.constructor==Number;
}

function isString(str){
return (typeof str=='string')&&str.constructor==String;
}

function JSONstringify(tobj){
if(tobj instanceof Array){
return AtoJSON(tobj);
}else if(isString(tobj)){
return StoJSON(tobj);
}else if(tobj instanceof Function){
return tobj.toString();
}else if(tobj instanceof Boolean){
return tobj.toString();
}else if(isNumber(tobj)){
return tobj.toString();
}else if(tobj instanceof RegExp){
return tobj.toString();
}else if(tobj instanceof Date){
return tobj.toString();
}else if(tobj instanceof Object){
return OtoJSON(tobj)
}else{
return '"'+tobj.toString()+'"';
}
}

function OtoJSON(obj){
var json = [];
var i;
for(i in obj){
if(!obj.hasOwnProperty(i)){
continue;
}
json.push(
JSONstringify(i) + ":" +
((obj[i] != null) ? JSONstringify(obj[i]) : "null")
)
}
return "{" + json.join(",") + "}";
}

//数组转换为json str
function AtoJSON(arr){
for(var i=0,json=[],j=arr.length;i<j;i++){
json[i] = (arr[i] != null) ? JSONstringify(arr[i]) : "null";
}
return "["+json.join(",")+"]";
}

//字符串格式化并转换为json str
function StoJSON(s){
return '"' +
s.replace(/(\\|\")/g,"\\$1")
.replace(/\n|\r|\t/g,function(){
var a = arguments[0];
return  (a == '\n') ? '\\n':
(a == '\r') ? '\\r':
(a == '\t') ? '\\t': ""
}) +
'"';
}

return JSONstringify(o);
}

var test = {
a:["asdf",function(){return 123;},/asdf/g,123],
b:"asdfadfsaf",
c:function(){
var arr = [123,333];
return arr;
},
d:{
aa:[1,2,3,"a","b",function(){return 0;},{aaa:1,bbb:["sss",1]}],
bb:"test"
}
};

alert(ToJSON(test));</script>

解决方案 »

  1.   

    之前也写过,参见:http://www.jslab.org.cn/?tag=JSON
    <script type="text/javascript">var toJSON = function(obj){
        var objco = (obj.constructor==Object),objca = (obj.constructor==Array),ret = [],sobj = null,acfoo = arguments.callee;
        if(!objco&&!objca){return obj.toString();}
        var toString = function(cobj,ot){
            if(!cobj){
                cobj = cobj===undefined?'undefined':(cobj===null?'null':(cobj===false?'false':(cobj===0?'0':(cobj===''?'\'\'':'NaN'))));
                if(ot){ret.push(d+':'+cobj)}else{ret.push(cobj);};return;
            }
            switch(cobj.constructor){
                case Array:
                case Object:if(ot){ret.push(d+':'+acfoo(cobj))}else{ret.push(acfoo(cobj))};break;
                case String:if(ot){ret.push(d+':\''+cobj.toString()+'\'')}else{ret.push('\''+cobj.toString()+'\'')};break;
                default:if(ot){ret.push(d+':'+cobj.toString())}else{ret.push(cobj.toString())};
            }
        };
        if(objco){for(var d in obj){sobj = obj[d];toString(sobj,true);}}
        if(objca){for(var i=0;i<obj.length;i++){sobj = obj[i];toString(sobj,false);}}
        obj = null;sobj = null;acfoo = null;
        return (objco)?'{'+ret.toString()+'}':(objca)?'['+ret.toString()+']':obj.toString();
    };var a = [0,1,2,3,{a:1},2,1,5,4,null,undefined,6,false,4,2,null,NaN,NaN,null,['a','c'],{a:1},function(){},100];
    var sa = toJSON(a);var b = {a:1,b:0,c:false,d:null,e:undefined,f:NaN,g:''};
    var sb = toJSON(b);alert(sa);
    alert(sb);
    var c = {a:[1,function(){},{f:0}],b:{c:2},d:3,e:function(){alert('e');}};var d = [[1,function(){},{f:0}],{c:2},3,function(){alert('e');}];alert(toJSON(c));alert(toJSON(d));alert(toJSON(true));alert(toJSON(/test/ig));alert(toJSON(20156));alert(toJSON(new Date()));</script>