commit extjs-2.2.1
[extjs.git] / source / util / JSON.js
1 /*\r
2  * Ext JS Library 2.2.1\r
3  * Copyright(c) 2006-2009, Ext JS, LLC.\r
4  * licensing@extjs.com\r
5  * \r
6  * http://extjs.com/license\r
7  */\r
8 \r
9 /**\r
10  * @class Ext.util.JSON\r
11  * Modified version of Douglas Crockford"s json.js that doesn"t\r
12  * mess with the Object prototype\r
13  * http://www.json.org/js.html\r
14  * @singleton\r
15  */\r
16 Ext.util.JSON = new (function(){\r
17     var useHasOwn = !!{}.hasOwnProperty;\r
18 \r
19     // crashes Safari in some instances\r
20     //var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;\r
21 \r
22     var pad = function(n) {\r
23         return n < 10 ? "0" + n : n;\r
24     };\r
25 \r
26     var m = {\r
27         "\b": '\\b',\r
28         "\t": '\\t',\r
29         "\n": '\\n',\r
30         "\f": '\\f',\r
31         "\r": '\\r',\r
32         '"' : '\\"',\r
33         "\\": '\\\\'\r
34     };\r
35 \r
36     var encodeString = function(s){\r
37         if (/["\\\x00-\x1f]/.test(s)) {\r
38             return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {\r
39                 var c = m[b];\r
40                 if(c){\r
41                     return c;\r
42                 }\r
43                 c = b.charCodeAt();\r
44                 return "\\u00" +\r
45                     Math.floor(c / 16).toString(16) +\r
46                     (c % 16).toString(16);\r
47             }) + '"';\r
48         }\r
49         return '"' + s + '"';\r
50     };\r
51 \r
52     var encodeArray = function(o){\r
53         var a = ["["], b, i, l = o.length, v;\r
54             for (i = 0; i < l; i += 1) {\r
55                 v = o[i];\r
56                 switch (typeof v) {\r
57                     case "undefined":\r
58                     case "function":\r
59                     case "unknown":\r
60                         break;\r
61                     default:\r
62                         if (b) {\r
63                             a.push(',');\r
64                         }\r
65                         a.push(v === null ? "null" : Ext.util.JSON.encode(v));\r
66                         b = true;\r
67                 }\r
68             }\r
69             a.push("]");\r
70             return a.join("");\r
71     };\r
72 \r
73     this.encodeDate = function(o){\r
74         return '"' + o.getFullYear() + "-" +\r
75                 pad(o.getMonth() + 1) + "-" +\r
76                 pad(o.getDate()) + "T" +\r
77                 pad(o.getHours()) + ":" +\r
78                 pad(o.getMinutes()) + ":" +\r
79                 pad(o.getSeconds()) + '"';\r
80     };\r
81 \r
82     /**\r
83      * Encodes an Object, Array or other value\r
84      * @param {Mixed} o The variable to encode\r
85      * @return {String} The JSON string\r
86      */\r
87     this.encode = function(o){\r
88         if(typeof o == "undefined" || o === null){\r
89             return "null";\r
90         }else if(Ext.isArray(o)){\r
91             return encodeArray(o);\r
92         }else if(Ext.isDate(o)){\r
93             return Ext.util.JSON.encodeDate(o);\r
94         }else if(typeof o == "string"){\r
95             return encodeString(o);\r
96         }else if(typeof o == "number"){\r
97             return isFinite(o) ? String(o) : "null";\r
98         }else if(typeof o == "boolean"){\r
99             return String(o);\r
100         }else {\r
101             var a = ["{"], b, i, v;\r
102             for (i in o) {\r
103                 if(!useHasOwn || o.hasOwnProperty(i)) {\r
104                     v = o[i];\r
105                     switch (typeof v) {\r
106                     case "undefined":\r
107                     case "function":\r
108                     case "unknown":\r
109                         break;\r
110                     default:\r
111                         if(b){\r
112                             a.push(',');\r
113                         }\r
114                         a.push(this.encode(i), ":",\r
115                                 v === null ? "null" : this.encode(v));\r
116                         b = true;\r
117                     }\r
118                 }\r
119             }\r
120             a.push("}");\r
121             return a.join("");\r
122         }\r
123     };\r
124 \r
125     /**\r
126      * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError.\r
127      * @param {String} json The JSON string\r
128      * @return {Object} The resulting object\r
129      */\r
130     this.decode = function(json){\r
131         return eval("(" + json + ')');\r
132     };\r
133 })();\r
134 /**\r
135  * Shorthand for {@link Ext.util.JSON#encode}\r
136  * @param {Mixed} o The variable to encode\r
137  * @return {String} The JSON string\r
138  * @member Ext\r
139  * @method encode\r
140  */\r
141 Ext.encode = Ext.util.JSON.encode;\r
142 /**\r
143  * Shorthand for {@link Ext.util.JSON#decode}\r
144  * @param {String} json The JSON string\r
145  * @return {Object} The resulting object\r
146  * @member Ext\r
147  * @method decode\r
148  */\r
149 Ext.decode = Ext.util.JSON.decode;\r