password-manager/frontend/beta/js/YUI-extensions/JSON.js
2011-10-03 00:56:18 +01:00

133 lines
4.1 KiB
JavaScript

/**
* @class YAHOO.ext.util.JSON
* Modified version of Douglas Crockford's json.js that doesn't
* mess with the Object prototype
* http://www.json.org/js.html
* @singleton
*/
YAHOO.ext.util.JSON = new function(){
var useHasOwn = {}.hasOwnProperty ? true : false;
// crashes Safari in some instances
//var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
var pad = function(n) {
return n < 10 ? '0' + n : n;
};
var m = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"' : '\\"',
'\\': '\\\\'
};
var encodeString = function(s){
if (/["\\\x00-\x1f]/.test(s)) {
return '"' + s.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 '"' + s + '"';
};
var encodeArray = function(o){
var a = ['['], b, i, l = o.length, v;
for (i = 0; i < l; i += 1) {
v = o[i];
switch (typeof v) {
case 'undefined':
case 'function':
case 'unknown':
break;
default:
if (b) {
a.push(',');
}
a.push(v === null ? "null" : YAHOO.ext.util.JSON.encode(v));
b = true;
}
}
a.push(']');
return a.join('');
};
var encodeDate = function(o){
return '"' + o.getFullYear() + '-' +
pad(o.getMonth() + 1) + '-' +
pad(o.getDate()) + 'T' +
pad(o.getHours()) + ':' +
pad(o.getMinutes()) + ':' +
pad(o.getSeconds()) + '"';
};
/**
* Encodes an Object, Array or other value
* @param {Mixed} o The variable to encode
* @return {String} The JSON string
*/
this.encode = function(o){
if(typeof o == 'undefined' || o === null){
return 'null';
}else if(o instanceof Array){
return encodeArray(o);
}else if(o instanceof Date){
return encodeDate(o);
}else if(typeof o == 'string'){
return encodeString(o);
}else if(typeof o == 'number'){
return isFinite(o) ? String(o) : "null";
}else if(typeof o == 'boolean'){
return String(o);
}else {
var a = ['{'], b, i, v;
for (var i in o) {
if(!useHasOwn || o.hasOwnProperty(i)) {
v = o[i];
switch (typeof v) {
case 'undefined':
case 'function':
case 'unknown':
break;
default:
if(b){
a.push(',');
}
a.push(this.encode(i), ':',
v === null ? "null" : this.encode(v));
b = true;
}
}
}
a.push('}');
return a.join('');
}
};
/**
* Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError.
* @param {String} json The JSON string
* @return {Object} The resulting object
*/
this.decode = function(json){
// although crockford had a good idea, this line crashes safari in some instances
//try{
//if(validRE.test(json)) {
return eval('(' + json + ')');
// }
// }catch(e){
// }
// throw new SyntaxError("parseJSON");
};
}();