aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeresig <jeresig@gmail.com>2010-01-23 17:08:26 -0500
committerjeresig <jeresig@gmail.com>2010-01-23 17:08:26 -0500
commit781fe8b80d08b287e4c6e4ca408f773c6a1f3b2d (patch)
tree2c18743d9c7117b69c400e44a7e8de0c6b0bfaa6
parentea9e0ed841f0f2851162e01d5199052872ba7483 (diff)
downloadjquery-781fe8b80d08b287e4c6e4ca408f773c6a1f3b2d.tar.gz
jquery-781fe8b80d08b287e4c6e4ca408f773c6a1f3b2d.zip
Make empty strings (and other non-string values) simply return null from parseJSON. Also added some parseJSON tests. Fixes #5859.
-rw-r--r--src/core.js19
-rw-r--r--test/unit/core.js25
2 files changed, 34 insertions, 10 deletions
diff --git a/src/core.js b/src/core.js
index 5c9906888..efdc4570f 100644
--- a/src/core.js
+++ b/src/core.js
@@ -472,25 +472,24 @@ jQuery.extend({
},
parseJSON: function( data ) {
+ if ( typeof data !== "string" || !data ) {
+ return null;
+ }
+
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
- if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
+ if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
- .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
// Try to use the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- data = window.JSON.parse( data );
-
- } else {
- data = (new Function("return " + data))();
- }
+ return window.JSON && window.JSON.parse ?
+ window.JSON.parse( data ) :
+ (new Function("return " + data))();
} else {
jQuery.error( "Invalid JSON: " + data );
}
-
- return data;
},
noop: function() {},
diff --git a/test/unit/core.js b/test/unit/core.js
index a61f8ba0f..54ad982d2 100644
--- a/test/unit/core.js
+++ b/test/unit/core.js
@@ -805,3 +805,28 @@ test("jQuery.proxy", function(){
// Use the string shortcut
jQuery.proxy( thisObject, "method" )();
});
+
+test("jQuery.parseJSON", function(){
+ expect(7);
+
+ equals( jQuery.parseJSON(), null, "Nothing in, null out." );
+ equals( jQuery.parseJSON( null ), null, "Nothing in, null out." );
+ equals( jQuery.parseJSON( "" ), null, "Nothing in, null out." );
+
+ same( jQuery.parseJSON("{}"), {}, "Plain object parsing." );
+ same( jQuery.parseJSON('{"test":1}'), {"test":1}, "Plain object parsing." );
+
+ try {
+ jQuery.parseJSON("{a:1}");
+ ok( false, "Test malformed JSON string." );
+ } catch( e ) {
+ ok( true, "Test malformed JSON string." );
+ }
+
+ try {
+ jQuery.parseJSON("{'a':1}");
+ ok( false, "Test malformed JSON string." );
+ } catch( e ) {
+ ok( true, "Test malformed JSON string." );
+ }
+}); \ No newline at end of file