最近时常需要将对象转为字符串,网上的方法中,著名的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>
<!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>
解决方案 »
- jquery语法错误
- parent.document.getElementById("main").src中的parent是什么意思?
- 求一正则表达式!!!全角转换为半角
- ExtJS4中treePanel为何循环加载树结构,导致浏览器奔溃
- 关于ActiveXObject的参数的问题
- 请问我这里从网上找来的打印设置代码怎么用
- 同志们,不能用javascript控制鼠标的位置??
- URL转发怎么,出问题了
- 不用数组能不能在javascript里引用有规则表单对象名 (急救)
- 请教关于用javascript制作动态按钮的问题。
- 很简单的js问题,请教一下
- Prototye1.5中Ajax.Updater()中自定义函数中取的数据一直不能取到新数据?
<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>