define([
|
"../core"
|
], function( jQuery ) {
|
|
var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
|
|
jQuery.parseJSON = function( data ) {
|
// Attempt to parse using the native JSON parser first
|
if ( window.JSON && window.JSON.parse ) {
|
// Support: Android 2.3
|
// Workaround failure to string-cast null input
|
return window.JSON.parse( data + "" );
|
}
|
|
var requireNonComma,
|
depth = null,
|
str = jQuery.trim( data + "" );
|
|
// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
|
// after removing valid tokens
|
return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
|
|
// Force termination if we see a misplaced comma
|
if ( requireNonComma && comma ) {
|
depth = 0;
|
}
|
|
// Perform no more replacements after returning to outermost depth
|
if ( depth === 0 ) {
|
return token;
|
}
|
|
// Commas must not follow "[", "{", or ","
|
requireNonComma = open || comma;
|
|
// Determine new depth
|
// array/object open ("[" or "{"): depth += true - false (increment)
|
// array/object close ("]" or "}"): depth += false - true (decrement)
|
// other cases ("," or primitive): depth += true - true (numeric cast)
|
depth += !close - !open;
|
|
// Remove this token
|
return "";
|
}) ) ?
|
( Function( "return " + str ) )() :
|
jQuery.error( "Invalid JSON: " + data );
|
};
|
|
return jQuery.parseJSON;
|
|
});
|