From 3a6661f0c5522f1246a75cce894cf8e2a527d999 Mon Sep 17 00:00:00 2001 From: erickson Date: Fri, 3 Aug 2007 19:31:12 +0000 Subject: [PATCH] adding new JSON parsing JS code, for wrapped class objects git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@1074 9efc2488-bf62-4759-914b-345cdb29e865 --- src/javascript/JSON_wrapper.js | 201 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 src/javascript/JSON_wrapper.js diff --git a/src/javascript/JSON_wrapper.js b/src/javascript/JSON_wrapper.js new file mode 100644 index 0000000..cfc0a36 --- /dev/null +++ b/src/javascript/JSON_wrapper.js @@ -0,0 +1,201 @@ +var JSON_CLASS_KEY = '__c'; +var JSON_DATA_KEY = '__p'; + + + +function JSON_version() { return 'wrapper' } + +function JSON2js(text) { + return decodeJS(JSON2jsRaw(text)); +} + +function JSON2jsRaw(text) { + var obj; + eval('obj = ' + text); + return obj; +} + + +/* iterates over object, arrays, or fieldmapper objects */ +function jsIterate( arg, callback ) { + if( arg && typeof arg == 'object' ) { + if( arg.constructor == Array ) { + for( var i = 0; i < arg.length; i++ ) + callback(arg, i); + + } else if( arg.constructor == Object ) { + for( var i in arg ) + callback(arg, i); + + } else if( arg._isfieldmapper && arg.a ) { + for( var i = 0; i < arg.a.length; i++ ) + callback(arg.a, i); + } + } +} + + +/* removes the class/paylod wrapper objects */ +function decodeJS(arg) { + + if(arg == null) return null; + + if( arg && typeof arg == 'object' && + arg.constructor == Object && + arg[JSON_CLASS_KEY] ) { + eval('arg = new ' + arg[JSON_CLASS_KEY] + '(arg[JSON_DATA_KEY])'); + } + + jsIterate( arg, + function(o, i) { + o[i] = decodeJS(o[i]); + } + ); + + return arg; +} + + +function jsClone(obj) { + if( obj == null ) return null; + if( typeof obj != 'object' ) return obj; + + var newobj; + if (obj.constructor == Array) { + newobj = []; + for( var i = 0; i < obj.length; i++ ) + newobj[i] = jsClone(obj[i]); + + } else if( obj.constructor == Object ) { + newobj = {}; + for( var i in obj ) + newobj[i] = jsClone(obj[i]); + + } else if( obj._isfieldmapper && obj.a ) { + eval('newobj = new '+obj.classname + '();'); + for( var i = 0; i < obj.a.length; i++ ) + newobj.a[i] = jsClone(obj.a[i]); + } + + return newobj; +} + + +/* adds the class/paylod wrapper objects */ +function encodeJS(arg) { + if( arg == null ) return null; + if( typeof arg != 'object' ) return arg; + + if( arg._isfieldmapper ) { + var newarr = [] + if(!arg.a) arg.a = []; + for( var i = 0; i < arg.a.length; i++ ) + newarr[i] = encodeJS(arg.a[i]); + + var a = {}; + a[JSON_CLASS_KEY] = arg.classname; + a[JSON_DATA_KEY] = newarr; + return a; + } + + var newobj; + + if(arg.length != undefined) { + newobj = []; + for( var i = 0; i < arg.length; i++ ) + newobj.push(encodeJS(arg[i])); + return newobj; + } + + newobj = {}; + for( var i in arg ) + newobj[i] = encodeJS(arg[i]); + return newobj; +} + +/* turns a javascript object into a JSON string */ +function js2JSON(arg) { + return js2JSONRaw(encodeJS(arg)); +} + +function js2JSONRaw(arg) { + + if( arg == null ) + return 'null'; + + var o; + + switch (typeof arg) { + + case 'object': + + if (arg.constructor == Array) { + o = ''; + jsIterate( arg, + function(obj, i) { + if (o) o += ','; + o += js2JSONRaw(obj[i]); + } + ); + return '[' + o + ']'; + + } else if (typeof arg.toString != 'undefined') { + o = ''; + jsIterate( arg, + function(obj, i) { + if (o) o += ','; + o = o + js2JSONRaw(i) + ':' + js2JSONRaw(obj[i]); + } + ); + return '{' + o + '}'; + + } else { + return 'null'; + } + + case 'number': return arg; + + case 'string': + var s = String(arg); + s = s.replace(/\\/g, '\\\\'); + s = s.replace(/"/g, '\\"'); + s = s.replace(/\t/g, "\\t"); + s = s.replace(/\n/g, "\\n"); + s = s.replace(/\r/g, "\\r"); + s = s.replace(/\f/g, "\\f"); + return '"' + s + '"'; + + default: return 'null'; + } +} + + +function __tabs(c) { + var s = ''; + for( i = 0; i < c; i++ ) s += '\t'; + return s; +} + +function jsonPretty(str) { + if(!str) return ""; + var s = ''; + var d = 0; + for( var i = 0; i < str.length; i++ ) { + var c = str.charAt(i); + if( c == '{' || c == '[' ) { + s += c + '\n' + __tabs(++d); + } else if( c == '}' || c == ']' ) { + s += '\n' + __tabs(--d) + '\n'; + if( str.charAt(i+1) == ',' ) { + s += '\n' + __tabs(d); + } + } else if( c == ',' ) { + s += ',\n' + __tabs(d); + } else { + s += c; + } + } + return s; +} + + -- 2.11.0