From: jeresig Date: Sat, 23 Jan 2010 22:08:26 +0000 (-0500) Subject: Make empty strings (and other non-string values) simply return null from parseJSON... X-Git-Url: http://git.asbjorn.it/?p=jquery.git;a=commitdiff_plain;h=781fe8b80d08b287e4c6e4ca408f773c6a1f3b2d Make empty strings (and other non-string values) simply return null from parseJSON. Also added some parseJSON tests. Fixes #5859. --- diff --git a/src/core.js b/src/core.js index 5c99068..efdc457 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 a61f8ba..54ad982 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