]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/javascript/JSON_v1.js
LP#1316245: JS now uses browser-native JSON routines
[OpenSRF.git] / src / javascript / JSON_v1.js
1 var JSON_CLASS_KEY    = '__c';
2 var JSON_DATA_KEY    = '__p';
3
4
5
6 function JSON_version() { return 'wrapper'; }
7
8 function JSON2js(text) {
9     return decodeJS(JSON.parse(text));
10 }
11
12 JSON2js.fallbackObjectifier = null;
13
14 /* iterates over object, arrays, or fieldmapper objects */
15 function jsIterate( arg, callback ) {
16     if( arg && typeof arg == 'object' ) {
17         if( arg.constructor == Array ) {
18             for( var i = 0; i < arg.length; i++ ) 
19                 callback(arg, i);
20
21         }  else if( arg.constructor == Object ) {
22                 for( var i in arg ) 
23                     callback(arg, i);
24
25         } else if( arg._isfieldmapper && arg.a ) {
26             for( var i = 0; i < arg.a.length; i++ ) 
27                 callback(arg.a, i);
28         }
29     }
30 }
31
32
33 /* removes the class/paylod wrapper objects */
34 function decodeJS(arg) {
35
36     if(arg == null) return null;
37
38     if(    arg && typeof arg == 'object' &&
39             arg.constructor == Object &&
40             arg[JSON_CLASS_KEY] ) {
41
42         try {
43             arg = eval('new ' + arg[JSON_CLASS_KEY] + '(arg[JSON_DATA_KEY])');    
44         } catch(E) {
45             if (JSON2js.fallbackObjectifier)
46                 arg = JSON2js.fallbackObjectifier(arg, JSON_CLASS_KEY, JSON_DATA_KEY );
47         }
48
49     }
50
51     if(arg._encodehash) {
52         jsIterate( arg.hash, 
53             function(o, i) {
54                 o[i] = decodeJS(o[i]);
55             }
56         );
57     } else {
58         jsIterate( arg, 
59             function(o, i) {
60                 o[i] = decodeJS(o[i]);
61             }
62         );
63     }
64
65     return arg;
66 }
67
68
69 function jsClone(obj) {
70     if( obj == null ) return null;
71     if( typeof obj != 'object' ) return obj;
72
73     var newobj;
74     if (obj.constructor == Array) {
75         newobj = [];
76         for( var i = 0; i < obj.length; i++ ) 
77             newobj[i] = jsClone(obj[i]);
78
79     } else if( obj.constructor == Object ) {
80         newobj = {};
81         for( var i in obj )
82             newobj[i] = jsClone(obj[i]);
83
84     } else if( obj._isfieldmapper && obj.a ) {
85         eval('newobj = new '+obj.classname + '();');
86         for( var i = 0; i < obj.a.length; i++ ) 
87             newobj.a[i] = jsClone(obj.a[i]);
88     }
89
90     return newobj;
91 }
92     
93
94 /* adds the class/payload wrapper objects */
95 function encodeJS(arg) {
96     if( arg == null ) return null;    
97     if( typeof arg != 'object' ) return arg;
98
99     if( arg._isfieldmapper ) {
100       var newarr = [];
101       if(!arg.a) arg.a = [];
102       for( var i = 0; i < arg.a.length; i++ ) 
103           newarr[i] = encodeJS(arg.a[i]);
104
105       var a = {};
106       a[JSON_CLASS_KEY] = arg.classname;
107       a[JSON_DATA_KEY] = newarr;
108       return a;
109     }
110
111     var newobj;
112
113     if(arg.length != undefined) {
114         newobj = [];
115         for( var i = 0; i < arg.length; i++ ) 
116             newobj.push(encodeJS(arg[i]));
117         return newobj;
118     } 
119    
120     newobj = {};
121     for( var i in arg )
122         newobj[i] = encodeJS(arg[i]);
123     return newobj;
124 }
125
126 /* turns a javascript object into a JSON string */
127 function js2JSON(arg) {
128     return JSON.stringify(encodeJS(arg));
129 }