Created
December 15, 2009 07:26
-
-
Save drewlesueur/256759 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* jQuery JSON Plugin | |
* version: 2.1 (2009-08-14) | |
* | |
* This document is licensed as free software under the terms of the | |
* MIT License: http://www.opensource.org/licenses/mit-license.php | |
* | |
* Brantley Harris wrote this plugin. It is based somewhat on the JSON.org | |
* website's http://www.json.org/json2.js, which proclaims: | |
* "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that | |
* I uphold. | |
* | |
* It is also influenced heavily by MochiKit's serializeJSON, which is | |
* copyrighted 2005 by Bob Ippolito. | |
*/ | |
(function($) { | |
/** jQuery.toJSON( json-serializble ) | |
Converts the given argument into a JSON respresentation. | |
If an object has a "toJSON" function, that will be used to get the representation. | |
Non-integer/string keys are skipped in the object, as are keys that point to a function. | |
json-serializble: | |
The *thing* to be converted. | |
**/ | |
$.toJSON = function(o) | |
{ | |
if (typeof(JSON) == 'object' && JSON.stringify) | |
return JSON.stringify(o); | |
var type = typeof(o); | |
if (o === null) | |
return "null"; | |
if (type == "undefined") | |
return undefined; | |
if (type == "number" || type == "boolean") | |
return o + ""; | |
if (type == "string") | |
return $.quoteString(o); | |
if (type == 'object') | |
{ | |
if (typeof o.toJSON == "function") | |
return $.toJSON( o.toJSON() ); | |
if (o.constructor === Date) | |
{ | |
var month = o.getUTCMonth() + 1; | |
if (month < 10) month = '0' + month; | |
var day = o.getUTCDate(); | |
if (day < 10) day = '0' + day; | |
var year = o.getUTCFullYear(); | |
var hours = o.getUTCHours(); | |
if (hours < 10) hours = '0' + hours; | |
var minutes = o.getUTCMinutes(); | |
if (minutes < 10) minutes = '0' + minutes; | |
var seconds = o.getUTCSeconds(); | |
if (seconds < 10) seconds = '0' + seconds; | |
var milli = o.getUTCMilliseconds(); | |
if (milli < 100) milli = '0' + milli; | |
if (milli < 10) milli = '0' + milli; | |
return '"' + year + '-' + month + '-' + day + 'T' + | |
hours + ':' + minutes + ':' + seconds + | |
'.' + milli + 'Z"'; | |
} | |
if (o.constructor === Array) | |
{ | |
var ret = []; | |
for (var i = 0; i < o.length; i++) | |
ret.push( $.toJSON(o[i]) || "null" ); | |
return "[" + ret.join(",") + "]"; | |
} | |
var pairs = []; | |
for (var k in o) { | |
var name; | |
var type = typeof k; | |
if (type == "number") | |
name = '"' + k + '"'; | |
else if (type == "string") | |
name = $.quoteString(k); | |
else | |
continue; //skip non-string or number keys | |
if (typeof o[k] == "function") | |
continue; //skip pairs where the value is a function. | |
var val = $.toJSON(o[k]); | |
pairs.push(name + ":" + val); | |
} | |
return "{" + pairs.join(", ") + "}"; | |
} | |
}; | |
/** jQuery.evalJSON(src) | |
Evaluates a given piece of json source. | |
**/ | |
$.evalJSON = function(src) | |
{ | |
if (typeof(JSON) == 'object' && JSON.parse) | |
return JSON.parse(src); | |
return eval("(" + src + ")"); | |
}; | |
/** jQuery.secureEvalJSON(src) | |
Evals JSON in a way that is *more* secure. | |
**/ | |
$.secureEvalJSON = function(src) | |
{ | |
if (typeof(JSON) == 'object' && JSON.parse) | |
return JSON.parse(src); | |
var filtered = src; | |
filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@'); | |
filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); | |
filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); | |
if (/^[\],:{}\s]*$/.test(filtered)) | |
return eval("(" + src + ")"); | |
else | |
throw new SyntaxError("Error parsing JSON, source is not valid."); | |
}; | |
/** jQuery.quoteString(string) | |
Returns a string-repr of a string, escaping quotes intelligently. | |
Mostly a support function for toJSON. | |
Examples: | |
>>> jQuery.quoteString("apple") | |
"apple" | |
>>> jQuery.quoteString('"Where are we going?", she asked.') | |
"\"Where are we going?\", she asked." | |
**/ | |
$.quoteString = function(string) | |
{ | |
if (string.match(_escapeable)) | |
{ | |
return '"' + string.replace(_escapeable, function (a) | |
{ | |
var c = _meta[a]; | |
if (typeof c === 'string') return c; | |
c = a.charCodeAt(); | |
return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); | |
}) + '"'; | |
} | |
return '"' + string + '"'; | |
}; | |
var _escapeable = /["\\\x00-\x1f\x7f-\x9f]/g; | |
var _meta = { | |
'\b': '\\b', | |
'\t': '\\t', | |
'\n': '\\n', | |
'\f': '\\f', | |
'\r': '\\r', | |
'"' : '\\"', | |
'\\': '\\\\' | |
}; | |
})(jQuery); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment