if (!Array.prototype.toJSONString) {
    Array.prototype.toJSONString = function(w) { var a = [], i, l = this.length, v; for (i = 0; i < l; i += 1) { v = this[i]; switch (typeof v) { case 'object': if (v) { if (typeof v.toJSONString === 'function') { a.push(v.toJSONString(w)); } } else { a.push('null'); } break; case 'string': case 'number': case 'boolean': a.push(v.toJSONString()); } } return '[' + a.join(',') + ']'; }; Boolean.prototype.toJSONString = function() { return String(this); }; Date.prototype.toJSONString = function() { function f(n) { return n < 10 ? '0' + n : n; }; return '"' + this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z"'; }; Number.prototype.toJSONString = function() { return isFinite(this) ? String(this) : 'null'; };    
    (function(s) { var m = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' }; s.parseJSON = function(filter) { var j; function walk(k, v) { var i; if (v && typeof v === 'object') { for (i in v) { if (Object.prototype.hasOwnProperty.apply(v, [i])) { v[i] = walk(i, v[i]); } } } return filter(k, v); }; if (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) { j = eval('(' + this + ')'); return typeof filter === 'function' ? walk('', j) : j; } throw new SyntaxError('parseJSON'); }; s.toJSONString = function() { if (/["\\\x00-\x1f]/.test(this)) { return '"' + this.replace(/[\x00-\x1f\\"]/g, function(a) { var c = m[a]; if (c) { return c; } c = a.charCodeAt(); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }) + '"'; } return '"' + this + '"'; }; })(String.prototype);
}

ObjectToJSONString = function(o, w) { var a = [], k, i, v; if (w) { for (i = 0; i < w.length; i += 1) { k = w[i]; if (typeof k === 'string') { v = o[k]; switch (typeof v) { case 'object': if (v) { if (typeof v.toJSONString === 'function') { a.push(k.toJSONString() + ':' + v.toJSONString(w)); } } else { a.push(k.toJSONString() + ':null'); } break; case 'string': case 'number': case 'boolean': a.push(k.toJSONString() + ':' + v.toJSONString()); } } } } else { for (k in o) { if (typeof k === 'string' && Object.prototype.hasOwnProperty.apply(o, [k])) { v = o[k]; switch (typeof v) { case 'object': if (v) { if (typeof v.toJSONString === 'function') { a.push(k.toJSONString() + ':' + v.toJSONString()); } } else { a.push(k.toJSONString() + ':null'); } break; case 'string': case 'number': case 'boolean': a.push(k.toJSONString() + ':' + v.toJSONString()); } } } } return '{' + a.join(',') + '}'; };