d59ca0c97ed5ffeb5e9fba3e432477db493f6850
[jquery.git] / build / js / json.js
1 /*
2     json.js
3     2006-04-28
4
5     This file adds these methods to JavaScript:
6
7         object.toJSONString()
8
9             This method produces a JSON text from an object. The
10             object must not contain any cyclical references.
11
12         array.toJSONString()
13
14             This method produces a JSON text from an array. The
15             array must not contain any cyclical references.
16
17         string.parseJSON()
18
19             This method parses a JSON text to produce an object or
20             array. It will return false if there is an error.
21 */
22 (function () {
23     var m = {
24             '\b': '\\b',
25             '\t': '\\t',
26             '\n': '\\n',
27             '\f': '\\f',
28             '\r': '\\r',
29             '"' : '\\"',
30             '\\': '\\\\'
31         },
32         s = {
33             array: function (x) {
34                 var a = ['['], b, f, i, l = x.length, v;
35                 for (i = 0; i < l; i += 1) {
36                     v = x[i];
37                     f = s[typeof v];
38                     if (f) {
39                         v = f(v);
40                         if (typeof v == 'string') {
41                             if (b) {
42                                 a[a.length] = ',';
43                             }
44                             a[a.length] = v;
45                             b = true;
46                         }
47                     }
48                 }
49                 a[a.length] = ']';
50                 return a.join('');
51             },
52             'boolean': function (x) {
53                 return String(x);
54             },
55             'null': function (x) {
56                 return "null";
57             },
58             number: function (x) {
59                 return isFinite(x) ? String(x) : 'null';
60             },
61             object: function (x) {
62                 if (x) {
63                     if (x instanceof Array) {
64                         return s.array(x);
65                     }
66                     var a = ['{'], b, f, i, v;
67                     for (i in x) {
68                         v = x[i];
69                         f = s[typeof v];
70                         if (f) {
71                             v = f(v);
72                             if (typeof v == 'string') {
73                                 if (b) {
74                                     a[a.length] = ',';
75                                 }
76                                 a.push(s.string(i), ':', v);
77                                 b = true;
78                             }
79                         }
80                     }
81                     a[a.length] = '}';
82                     return a.join('');
83                 }
84                 return 'null';
85             },
86             string: function (x) {
87                 if (/["\\\x00-\x1f]/.test(x)) {
88                     x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
89                         var c = m[b];
90                         if (c) {
91                             return c;
92                         }
93                         c = b.charCodeAt();
94                         return '\\u00' +
95                             Math.floor(c / 16).toString(16) +
96                             (c % 16).toString(16);
97                     });
98                 }
99                 return '"' + x + '"';
100             }
101         };
102
103     Object.toJSON = function(obj) {
104         return s.object(obj);
105     };
106 })();
107
108 String.prototype.parseJSON = function () {
109     try {
110         return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
111                 this.replace(/"(\\.|[^"\\])*"/g, ''))) &&
112             eval('(' + this + ')');
113     } catch (e) {
114         return false;
115     }
116 };
117