1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/*
JSONstring v 1.01
copyright 2006 Thomas Frank
(small sanitizer added to the toObject-method, May 2008)
This EULA grants you the following rights:
Installation and Use. You may install and use an unlimited number of copies of the SOFTWARE PRODUCT.
Reproduction and Distribution. You may reproduce and distribute an unlimited number of copies of the SOFTWARE PRODUCT either in whole or in part; each copy should include all copyright and trademark notices, and shall be accompanied by a copy of this EULA. Copies of the SOFTWARE PRODUCT may be distributed as a standalone product or included with your own product.
Commercial Use. You may sell for profit and freely distribute scripts and/or compiled scripts that were created with the SOFTWARE PRODUCT.
Based on Steve Yen's implementation:
http://trimpath.com/project/wiki/JsonLibrary
Sanitizer regExp:
Andrea Giammarchi 2007
*/
JSONstring={
compactOutput:false,
includeProtos:false,
includeFunctions: false,
detectCirculars:true,
restoreCirculars:true,
make:function(arg,restore) {
this.restore=restore;
this.mem=[];this.pathMem=[];
return this.toJsonStringArray(arg).join('');
},
toObject:function(x){
if(!this.cleaner){
try{this.cleaner=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
catch(a){this.cleaner=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
};
if(!this.cleaner.test(x)){return {}};
eval("this.myObj="+x);
if(!this.restoreCirculars || !alert){return this.myObj};
if(this.includeFunctions){
var x=this.myObj;
for(var i in x){if(typeof x[i]=="string" && !x[i].indexOf("JSONincludedFunc:")){
x[i]=x[i].substring(17);
eval("x[i]="+x[i])
}}
};
this.restoreCode=[];
this.make(this.myObj,true);
var r=this.restoreCode.join(";")+";";
eval('r=r.replace(/\\W([0-9]{1,})(\\W)/g,"[$1]$2").replace(/\\.\\;/g,";")');
eval(r);
return this.myObj
},
toJsonStringArray:function(arg, out) {
if(!out){this.path=[]};
out = out || [];
var u; // undefined
switch (typeof arg) {
case 'object':
this.lastObj=arg;
if(this.detectCirculars){
var m=this.mem; var n=this.pathMem;
for(var i=0;i<m.length;i++){
if(arg===m[i]){
out.push('"JSONcircRef:'+n[i]+'"');return out
}
};
m.push(arg); n.push(this.path.join("."));
};
if (arg) {
if (arg.constructor == Array) {
out.push('[');
for (var i = 0; i < arg.length; ++i) {
this.path.push(i);
if (i > 0)
out.push(',\n');
this.toJsonStringArray(arg[i], out);
this.path.pop();
}
out.push(']');
return out;
} else if (typeof arg.toString != 'undefined') {
out.push('{');
var first = true;
for (var i in arg) {
if(!this.includeProtos && arg[i]===arg.constructor.prototype[i]){continue};
this.path.push(i);
var curr = out.length;
if (!first)
out.push(this.compactOutput?',':',\n');
this.toJsonStringArray(i, out);
out.push(':');
this.toJsonStringArray(arg[i], out);
if (out[out.length - 1] == u)
out.splice(curr, out.length - curr);
else
first = false;
this.path.pop();
}
out.push('}');
return out;
}
return out;
}
out.push('null');
return out;
case 'unknown':
case 'undefined':
case 'function':
if(!this.includeFunctions){out.push(u);return out};
arg="JSONincludedFunc:"+arg;
out.push('"');
var a=['\n','\\n','\r','\\r','"','\\"'];
arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i]).join(a[i+1])};
out.push(arg);
out.push('"');
return out;
case 'string':
if(this.restore && arg.indexOf("JSONcircRef:")==0){
this.restoreCode.push('this.myObj.'+this.path.join(".")+"="+arg.split("JSONcircRef:").join("this.myObj."));
};
out.push('"');
var a=['\n','\\n','\r','\\r','"','\\"'];
arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i]).join(a[i+1])};
out.push(arg);
out.push('"');
return out;
default:
out.push(String(arg));
return out;
}
}
};
|