Make empty strings (and other non-string values) simply return null from parseJSON...
authorjeresig <jeresig@gmail.com>
Sat, 23 Jan 2010 22:08:26 +0000 (17:08 -0500)
committerjeresig <jeresig@gmail.com>
Sat, 23 Jan 2010 22:08:26 +0000 (17:08 -0500)
src/core.js
test/unit/core.js

index 5c99068..efdc457 100644 (file)
@@ -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() {},
index a61f8ba..54ad982 100644 (file)
@@ -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