emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  171 随笔 :: 103 文章 :: 1052 评论 :: 2 Trackbacks
这个是基本的转换例子
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> json-to-string </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="emu">
<META NAME="Keywords" CONTENT="json convert">
<META NAME="Description" CONTENT="convert a javascript object into a JSON string">
</HEAD>

<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var data={host:{url:"ad.market.com",page:[{name:"all",area:[{name:"rightbanner",tname:"all",tclass:"none",type:"jpg",ad:[{url:"abc.gif",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""}]},{name:"leftbanner",tname:"all",tclass:"none",type:"jpg",ad:[{url:"",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""}]}]},{name:"index.htm",area:[{name:"rightbanner",tname:"index.htm",tclass:"none",type:"swf",ad:[{url:"abcdef.swf",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""}]},{name:"leftbanner",tname:"index.htm",tclass:"none",type:"text",ad:[{url:"",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""},{url:"",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""},{url:"",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""}]}]}]}}

function obj2str(o){
    
var r = [];
    
if(typeof o =="string"return "\""+o.replace(/([\'\"\\])/g,"\\$1").replace(/(\n)/g,"\\n").replace(/(\r)/g,"\\r").replace(/(\t)/g,"\\t")+"\"";
    if(typeof o ==
"undefined") return "undefined";
    if(typeof o == 
"object"){
        if(o===null) return 
"null";
        else if(!o.sort){
            for(var i in o)
                r.push(i+
":"+obj2str(o[i]))
            r=
"{"+r.join()+"}"
        }else{
            for(var i =0;i<o.length;i++)
                r.push(obj2str(o[i]))
            r=
"["+r.join()+"]"
        }
        return r;
    }
    return o.toString();
}

alert(obj2str(data))
//-->
</SCRIPT>
</BODY>
</HTML>


要是想重载系统的native code函数(比如toString,join),就要根据不同的浏览器上不同的内部函数的具体表现做特殊对待了。比如重载toString函数在IE里面是默认遍历不到的,而firefox偏偏就可以。下面的例子在IE和firefox下面测试通过:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> json-to-string </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="emu">
<META NAME="Keywords" CONTENT="json convert">
<META NAME="Description" CONTENT="convert a javascript object into a JSON string">
</HEAD>

<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var data={host:{url:"ad.market.com",page:[{name:"all",area:[{name:"rightbanner",tname:"all",tclass:"none",type:"jpg",ad:[{url:"abc.gif",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""}]},{name:"leftbanner",tname:"all",tclass:"none",type:"jpg",ad:[{url:"",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""}]}]},{name:"index.htm",area:[{name:"rightbanner",tname:"index.htm",tclass:"none",type:"swf",ad:[{url:"abcdef.swf",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""}]},{name:"leftbanner",tname:"index.htm",tclass:"none",type:"text",ad:[{url:"",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""},{url:"",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""},{url:"",width:"",height:"",menu:"red",tran:"",href:"http://music.qq.com",alt:"aaaaaaaaa",target:"_blank",top:"",bottom:"",left:"",right:""}]}]}]},toString:function(){return obj2str(this)}}

function obj2str(o){
    
var r = [];
    
if(typeof o =="string"return "\""+o.replace(/([\'\"\\])/g,"\\$1").replace(/(\n)/g,"\\n").replace(/(\r)/g,"\\r").replace(/(\t)/g,"\\t")+"\"";
    if(typeof o == 
"object"){
        if(!o.sort){
            for(var i in o)
                r.push(i+
":"+obj2str(o[i]));
            if(!!document.all && !/^\n?function\s*toString\(\)\s*\{\n?\s*\[native code\]\n?\s*\}\n?\s*$/.test(o.toString)){
                r.push(
"toString:"+o.toString.toString());
            }
            r=
"{"+r.join()+"}"
        }else{
            for(var i =0;i<o.length;i++)
                r.push(obj2str(o[i]))
            r=
"["+r.join()+"]"
        }
        return r;
    }
    return o.toString();
}
alert(obj2str(data))
//-->
</SCRIPT>
</BODY>
</HTML>
posted on 2007-01-04 17:30 emu 阅读(4370) 评论(6)  编辑  收藏

评论

# re: 应twinsen要求写了个转换js对象为json字符串的例子 2007-08-15 20:29 emu
补充一个object克隆的简单方法,不支持function:
function objClone(o){
if(typeof o == "object"){
var r=(o.sort)?[]:{}
for(var i in o)
r[i]=objClone(o[i]);
return r;
}
return o;
}
  回复  更多评论
  

# re: 应twinsen要求写了个转换js对象为json字符串的例子 2009-04-11 15:52 谷歌
经过测试,不支持谷歌  回复  更多评论
  

# re: 应twinsen要求写了个转换js对象为json字符串的例子 2009-04-11 16:01 谷歌
汗,我能把上面的删除嘛,你给我删了个,经过仔细测试,支持谷歌  回复  更多评论
  

# re: 应twinsen要求写了个转换js对象为json字符串的例子 2010-07-15 11:00 lingcarlos
递归用的很熟啊  回复  更多评论
  

# re: 应twinsen要求写了个转换js对象为json字符串的例子[未登录] 2011-03-15 11:12 benx203
可不可以修改下,转换后保持对象的key是引号引起来的啊,有的地方要求格式比较严格  回复  更多评论
  

# re: 应twinsen要求写了个转换js对象为json字符串的例子[未登录] 2011-03-15 11:15 benx203
我把r.push(i+":"+obj2str(o[i]))修改成r.push("\""+i+"\":"+obj2str(o[i]))可以用了,谢谢!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: