94 lines
2.7 KiB
JavaScript
94 lines
2.7 KiB
JavaScript
/*
|
|
json2.js
|
|
2007-12-02
|
|
Public Domain
|
|
No warranty expressed or implied. Use at your own risk.
|
|
See http://www.JSON.org/js.html
|
|
This is a reference implementation. You are free to copy, modify, or
|
|
redistribute.
|
|
*/
|
|
if (!this.JSON) {
|
|
JSON = function () {
|
|
function f(n) {
|
|
return n < 10 ? '0' + n : n;
|
|
}
|
|
Date.prototype.toJSON = function () {
|
|
return this.getUTCFullYear() + '-' +
|
|
f(this.getUTCMonth() + 1) + '-' +
|
|
f(this.getUTCDate()) + 'T' +
|
|
f(this.getUTCHours()) + ':' +
|
|
f(this.getUTCMinutes()) + ':' +
|
|
f(this.getUTCSeconds()) + 'Z';
|
|
};
|
|
var m = {
|
|
'\b': '\\b','\t': '\\t','\n': '\\n','\f': '\\f','\r': '\\r','"' : '\\"','\\': '\\\\'
|
|
};
|
|
function stringify(value, whitelist) {
|
|
var a,i,k,l,r = /["\\\x00-\x1f\x7f-\x9f]/g,v;
|
|
switch (typeof value) {
|
|
case 'string':
|
|
return r.test(value) ?
|
|
'"' + value.replace(r, 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);
|
|
}) + '"' :
|
|
'"' + value + '"';
|
|
case 'number':
|
|
return isFinite(value) ? String(value) : 'null';
|
|
case 'boolean':
|
|
case 'null':
|
|
return String(value);
|
|
case 'object':
|
|
if (!value) return 'null';
|
|
if (typeof value.toJSON === 'function') return stringify(value.toJSON());
|
|
a = [];
|
|
if (typeof value.length === 'number' && !(value.propertyIsEnumerable('length'))) {
|
|
l = value.length;
|
|
for (i = 0; i < l; i += 1) {
|
|
a.push(stringify(value[i], whitelist) || 'null');
|
|
}
|
|
return '[' + a.join(',') + ']';
|
|
}
|
|
if (whitelist) {
|
|
l = whitelist.length;
|
|
for (i = 0; i < l; i += 1) {
|
|
k = whitelist[i];
|
|
if (typeof k === 'string') {
|
|
v = stringify(value[k], whitelist);
|
|
if (v) a.push(stringify(k) + ':' + v);
|
|
} }
|
|
} else {
|
|
for (k in value) {
|
|
if (typeof k === 'string') {
|
|
v = stringify(value[k], whitelist);
|
|
if (v) a.push(stringify(k) + ':' + v);
|
|
} } }
|
|
return '{' + a.join(',') + '}';
|
|
} }
|
|
return {
|
|
stringify: stringify,
|
|
parse: function (text, filter) {
|
|
var j;
|
|
function walk(k, v) {
|
|
var i, n;
|
|
if (v && typeof v === 'object') {
|
|
for (i in v) {
|
|
if (Object.prototype.hasOwnProperty.apply(v, [i])) {
|
|
n = walk(i, v[i]);
|
|
if (n !== undefined) v[i] = n;
|
|
} } }
|
|
return filter(k, v);
|
|
}
|
|
if (/^[\],:{}\s]*$/.test(text.replace(/\\./g, '@').
|
|
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']').
|
|
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
|
j = eval('(' + text + ')');
|
|
return typeof filter === 'function' ? walk('', j) : j;
|
|
}
|
|
throw new SyntaxError('parseJSON');
|
|
} };
|
|
}();
|
|
} |