JSONTools = { "toStr" : function(pType) { switch ( pType.constructor ) { case Object : return this.object(pType); break; case Array : return this.array(pType); break; case String : return this.string(pType); break; case Number : return this.number(pType); break; case Boolean : return this.boolean(pType); break; case Date : return this.date(pType); break; } }, "object" : function(pType) { var a = ['{'], b, k, v, _this = this; function p(s) { if ( b ) a.push(','); a.push(_this.toStr(k), ':', s); b = true; } for ( k in pType ) { if ( pType.hasOwnProperty(k) ) { v = pType[k]; switch ( typeof v ) { case 'object': if (v) p(this.toStr(v)); else p("null"); break; case 'string': case 'number': case 'boolean': p(this.toStr(v)); } } } a.push('}'); return a.join(''); }, "array" : function(pType) { var a = ['['], b, i, l = pType.length, v; function p(s) { if ( b ) a.push(','); a.push(s); b = true; } for ( i = 0; i < l; i += 1 ) { v = pType[i]; switch ( typeof v ) { case 'object': if ( v ) { p(this.toStr(v)); } else { p("null"); } break; case 'string': case 'number': case 'boolean': p(this.toStr(v)); } } a.push(']'); return a.join(''); }, "string" : function(pType) { var m = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }; if ( /[\\\x00-\x1f]/.test(pType) ) { return '"' + pType.replace(/([\x00-\x1f\\])/g, function(a, b) { var c = m[b]; if (c) { return c; } c = b.charCodeAt(); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }) + '"'; } return '"' + pType + '"'; }, "boolean" : function(pType) { return String(pType); }, "date" : function(pType) { function f(n) { return n < 10 ? '0' + n : n; } return '"' + pType.getFullYear() + '-' + f(pType.getMonth() + 1) + '-' + f(pType.getDate()) + 'T' + f(pType.getHours()) + ':' + f(pType.getMinutes()) + ':' + f(pType.getSeconds()) + '"'; }, "number" : function(pType) { return isFinite(pType) ? String(pType) : "null"; } }