Upgrade to ExtJS 3.0.3 - Released 10/11/2009
[extjs.git] / docs / source / JSON.html
1 <html>
2 <head>
3   <title>The source code</title>
4     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
5     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
6 </head>
7 <body  onload="prettyPrint();">
8     <pre class="prettyprint lang-js">/*!
9  * Ext JS Library 3.0.3
10  * Copyright(c) 2006-2009 Ext JS, LLC
11  * licensing@extjs.com
12  * http://www.extjs.com/license
13  */
14 <div id="cls-Ext.util.JSON"></div>/**
15  * @class Ext.util.JSON
16  * Modified version of Douglas Crockford"s json.js that doesn"t
17  * mess with the Object prototype
18  * http://www.json.org/js.html
19  * @singleton
20  */
21 Ext.util.JSON = new (function(){
22     var useHasOwn = !!{}.hasOwnProperty,
23         isNative = function() {
24             var useNative = null;
25
26             return function() {
27                 if (useNative === null) {
28                     useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
29                 }
30         
31                 return useNative;
32             };
33         }(),
34         pad = function(n) {
35             return n < 10 ? "0" + n : n;
36         },
37         doDecode = function(json){
38             return eval("(" + json + ')');    
39         },
40         doEncode = function(o){
41             if(!Ext.isDefined(o) || o === null){
42                 return "null";
43             }else if(Ext.isArray(o)){
44                 return encodeArray(o);
45             }else if(Ext.isDate(o)){
46                 return Ext.util.JSON.encodeDate(o);
47             }else if(Ext.isString(o)){
48                 return encodeString(o);
49             }else if(typeof o == "number"){
50                 //don't use isNumber here, since finite checks happen inside isNumber
51                 return isFinite(o) ? String(o) : "null";
52             }else if(Ext.isBoolean(o)){
53                 return String(o);
54             }else {
55                 var a = ["{"], b, i, v;
56                 for (i in o) {
57                     // don't encode DOM objects
58                     if(!o.getElementsByTagName){
59                         if(!useHasOwn || o.hasOwnProperty(i)) {
60                             v = o[i];
61                             switch (typeof v) {
62                             case "undefined":
63                             case "function":
64                             case "unknown":
65                                 break;
66                             default:
67                                 if(b){
68                                     a.push(',');
69                                 }
70                                 a.push(doEncode(i), ":",
71                                         v === null ? "null" : doEncode(v));
72                                 b = true;
73                             }
74                         }
75                     }
76                 }
77                 a.push("}");
78                 return a.join("");
79             }    
80         },
81         m = {
82             "\b": '\\b',
83             "\t": '\\t',
84             "\n": '\\n',
85             "\f": '\\f',
86             "\r": '\\r',
87             '"' : '\\"',
88             "\\": '\\\\'
89         },
90         encodeString = function(s){
91             if (/["\\\x00-\x1f]/.test(s)) {
92                 return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
93                     var c = m[b];
94                     if(c){
95                         return c;
96                     }
97                     c = b.charCodeAt();
98                     return "\\u00" +
99                         Math.floor(c / 16).toString(16) +
100                         (c % 16).toString(16);
101                 }) + '"';
102             }
103             return '"' + s + '"';
104         },
105         encodeArray = function(o){
106             var a = ["["], b, i, l = o.length, v;
107                 for (i = 0; i < l; i += 1) {
108                     v = o[i];
109                     switch (typeof v) {
110                         case "undefined":
111                         case "function":
112                         case "unknown":
113                             break;
114                         default:
115                             if (b) {
116                                 a.push(',');
117                             }
118                             a.push(v === null ? "null" : Ext.util.JSON.encode(v));
119                             b = true;
120                     }
121                 }
122                 a.push("]");
123                 return a.join("");
124         };
125
126     this.encodeDate = function(o){
127         return '"' + o.getFullYear() + "-" +
128                 pad(o.getMonth() + 1) + "-" +
129                 pad(o.getDate()) + "T" +
130                 pad(o.getHours()) + ":" +
131                 pad(o.getMinutes()) + ":" +
132                 pad(o.getSeconds()) + '"';
133     };
134
135     <div id="method-Ext.util.JSON-encode"></div>/**
136      * Encodes an Object, Array or other value
137      * @param {Mixed} o The variable to encode
138      * @return {String} The JSON string
139      */
140     this.encode = function() {
141         var ec;
142         return function(o) {
143             if (!ec) {
144                 // setup encoding function on first access
145                 ec = isNative() ? JSON.stringify : doEncode;
146             }
147             return ec(o);
148         };
149     }();
150
151
152     <div id="method-Ext.util.JSON-decode"></div>/**
153      * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError unless the safe option is set.
154      * @param {String} json The JSON string
155      * @return {Object} The resulting object
156      */
157     this.decode = function() {
158         var dc;
159         return function(json) {
160             if (!dc) {
161                 // setup decoding function on first access
162                 dc = isNative() ? JSON.parse : doDecode;
163             }
164             return dc(json);
165         };
166     }();
167
168 })();
169 <div id="method-Ext-encode"></div>/**
170  * Shorthand for {@link Ext.util.JSON#encode}
171  * @param {Mixed} o The variable to encode
172  * @return {String} The JSON string
173  * @member Ext
174  * @method encode
175  */
176 Ext.encode = Ext.util.JSON.encode;
177 <div id="method-Ext-decode"></div>/**
178  * Shorthand for {@link Ext.util.JSON#decode}
179  * @param {String} json The JSON string
180  * @param {Boolean} safe (optional) Whether to return null or throw an exception if the JSON is invalid.
181  * @return {Object} The resulting object
182  * @member Ext
183  * @method decode
184  */
185 Ext.decode = Ext.util.JSON.decode;
186 </pre>
187 </body>
188 </html>