1 <html><head><title>Roo/util/JSON.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/*
4 * Copyright(c) 2006-2007, Ext JS, LLC.
6 * Originally Released Under LGPL - original licence link has changed is not relivant.
9 * <script type="text/javascript">
12 * @class Roo.util.JSON
13 * Modified version of Douglas Crockford"s json.js that doesn"t
14 * mess with the Object prototype
15 * http://www.json.org/js.html
18 </span><span class="jsdoc-var">Roo.util.JSON </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
19 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">useHasOwn </span><span class="jsdoc-syntax">= {}</span><span class="jsdoc-var">.hasOwnProperty </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">true </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
21 </span><span class="jsdoc-comment">// crashes Safari in some instances
22 //var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
24 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">pad </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">) {
25 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">< 10 ? </span><span class="jsdoc-string">"0" </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">;
28 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">m </span><span class="jsdoc-syntax">= {
29 </span><span class="jsdoc-string">"\b"</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'\\b'</span><span class="jsdoc-syntax">,
30 </span><span class="jsdoc-string">"\t"</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'\\t'</span><span class="jsdoc-syntax">,
31 </span><span class="jsdoc-string">"\n"</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'\\n'</span><span class="jsdoc-syntax">,
32 </span><span class="jsdoc-string">"\f"</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'\\f'</span><span class="jsdoc-syntax">,
33 </span><span class="jsdoc-string">"\r"</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'\\r'</span><span class="jsdoc-syntax">,
34 </span><span class="jsdoc-string">'"' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'\\"'</span><span class="jsdoc-syntax">,
35 </span><span class="jsdoc-string">"\\"</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'\\\\'
36 </span><span class="jsdoc-syntax">};
38 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">encodeString </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">s</span><span class="jsdoc-syntax">){
39 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(/["\\\x00-\x1f]/</span><span class="jsdoc-var">.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">s</span><span class="jsdoc-syntax">)) {
40 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">'"' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">s.replace</span><span class="jsdoc-syntax">(/([\x00-\x1f\\"])/g, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">b</span><span class="jsdoc-syntax">) {
41 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">m</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">b</span><span class="jsdoc-syntax">];
42 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">){
43 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
45 </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">b.charCodeAt</span><span class="jsdoc-syntax">();
46 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">"\\u00" </span><span class="jsdoc-syntax">+
47 </span><span class="jsdoc-var">Math.floor</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">/ 16)</span><span class="jsdoc-var">.toString</span><span class="jsdoc-syntax">(16) +
48 (</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">% 16)</span><span class="jsdoc-var">.toString</span><span class="jsdoc-syntax">(16);
49 }) + </span><span class="jsdoc-string">'"'</span><span class="jsdoc-syntax">;
51 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">'"' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">s </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'"'</span><span class="jsdoc-syntax">;
54 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">encodeArray </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
55 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">a </span><span class="jsdoc-syntax">= [</span><span class="jsdoc-string">"["</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">b</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">o.length</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">;
56 </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">< </span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">+= 1) {
57 </span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
58 </span><span class="jsdoc-keyword">switch </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">) {
59 </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">"undefined"</span><span class="jsdoc-syntax">:
60 </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">"function"</span><span class="jsdoc-syntax">:
61 </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">"unknown"</span><span class="jsdoc-syntax">:
62 </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
63 </span><span class="jsdoc-keyword">default</span><span class="jsdoc-syntax">:
64 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">b</span><span class="jsdoc-syntax">) {
65 </span><span class="jsdoc-var">a.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">','</span><span class="jsdoc-syntax">);
67 </span><span class="jsdoc-var">a.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">null </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">"null" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.util.JSON.encode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">));
68 </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
71 </span><span class="jsdoc-var">a.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"]"</span><span class="jsdoc-syntax">);
72 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">a.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">""</span><span class="jsdoc-syntax">);
75 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">encodeDate </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
76 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">'"' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">o.getFullYear</span><span class="jsdoc-syntax">() + </span><span class="jsdoc-string">"-" </span><span class="jsdoc-syntax">+
77 </span><span class="jsdoc-var">pad</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.getMonth</span><span class="jsdoc-syntax">() + 1) + </span><span class="jsdoc-string">"-" </span><span class="jsdoc-syntax">+
78 </span><span class="jsdoc-var">pad</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.getDate</span><span class="jsdoc-syntax">()) + </span><span class="jsdoc-string">"T" </span><span class="jsdoc-syntax">+
79 </span><span class="jsdoc-var">pad</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.getHours</span><span class="jsdoc-syntax">()) + </span><span class="jsdoc-string">":" </span><span class="jsdoc-syntax">+
80 </span><span class="jsdoc-var">pad</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.getMinutes</span><span class="jsdoc-syntax">()) + </span><span class="jsdoc-string">":" </span><span class="jsdoc-syntax">+
81 </span><span class="jsdoc-var">pad</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o.getSeconds</span><span class="jsdoc-syntax">()) + </span><span class="jsdoc-string">'"'</span><span class="jsdoc-syntax">;
84 </span><span class="jsdoc-comment">/**
85 * Encodes an Object, Array or other value
86 * @param {Mixed} o The variable to encode
87 * @return {String} The JSON string
89 </span><span class="jsdoc-var">this.encode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">)
91 </span><span class="jsdoc-comment">// should this be extended to fully wrap stringify..
93 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"undefined" </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">){
94 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">"null"</span><span class="jsdoc-syntax">;
95 }</span><span class="jsdoc-keyword">else if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o </span><span class="jsdoc-keyword">instanceof </span><span class="jsdoc-var">Array</span><span class="jsdoc-syntax">){
96 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">encodeArray</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
97 }</span><span class="jsdoc-keyword">else if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o </span><span class="jsdoc-keyword">instanceof </span><span class="jsdoc-var">Date</span><span class="jsdoc-syntax">){
98 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">encodeDate</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
99 }</span><span class="jsdoc-keyword">else if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"string"</span><span class="jsdoc-syntax">){
100 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">encodeString</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
101 }</span><span class="jsdoc-keyword">else if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"number"</span><span class="jsdoc-syntax">){
102 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">isFinite</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">) ? </span><span class="jsdoc-var">String</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-string">"null"</span><span class="jsdoc-syntax">;
103 }</span><span class="jsdoc-keyword">else if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">o </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"boolean"</span><span class="jsdoc-syntax">){
104 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">String</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
105 }</span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
106 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">a </span><span class="jsdoc-syntax">= [</span><span class="jsdoc-string">"{"</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">b</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">;
107 </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-keyword">in </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">) {
108 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">useHasOwn </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">o.hasOwnProperty</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">)) {
109 </span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
110 </span><span class="jsdoc-keyword">switch </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">) {
111 </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">"undefined"</span><span class="jsdoc-syntax">:
112 </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">"function"</span><span class="jsdoc-syntax">:
113 </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">"unknown"</span><span class="jsdoc-syntax">:
114 </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
115 </span><span class="jsdoc-keyword">default</span><span class="jsdoc-syntax">:
116 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">b</span><span class="jsdoc-syntax">){
117 </span><span class="jsdoc-var">a.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">','</span><span class="jsdoc-syntax">);
119 </span><span class="jsdoc-var">a.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.encode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">), </span><span class="jsdoc-string">":"</span><span class="jsdoc-syntax">,
120 </span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">null </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">"null" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.encode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">));
121 </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
125 </span><span class="jsdoc-var">a.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"}"</span><span class="jsdoc-syntax">);
126 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">a.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">""</span><span class="jsdoc-syntax">);
130 </span><span class="jsdoc-comment">/**
131 * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError.
132 * @param {String} json The JSON string
133 * @return {Object} The resulting object
135 </span><span class="jsdoc-var">this.decode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">json</span><span class="jsdoc-syntax">){
137 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-comment">/** eval:var:json */ </span><span class="jsdoc-keyword">eval</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"(" </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">json </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">')'</span><span class="jsdoc-syntax">);
140 </span><span class="jsdoc-comment">/**
141 * Shorthand for {@link Roo.util.JSON#encode}
144 </span><span class="jsdoc-var">Roo.encode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">JSON</span><span class="jsdoc-syntax">) != </span><span class="jsdoc-string">'undefined' </span><span class="jsdoc-syntax">&& </span><span class="jsdoc-var">JSON.stringify </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">JSON.stringify </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.util.JSON.encode</span><span class="jsdoc-syntax">;
145 </span><span class="jsdoc-comment">/**
146 * Shorthand for {@link Roo.util.JSON#decode}
149 </span><span class="jsdoc-var">Roo.decode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">JSON</span><span class="jsdoc-syntax">) != </span><span class="jsdoc-string">'undefined' </span><span class="jsdoc-syntax">&& </span><span class="jsdoc-var">JSON.parse </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">JSON.parse </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.util.JSON.decode</span><span class="jsdoc-syntax">;
150 </span></code></body></html>