Detect JSON Ajax requests by the response content-type (like is done with XML). Fixes...
authorRick Waldron <waldron.rick@gmail.com>
Wed, 6 Jan 2010 00:48:16 +0000 (19:48 -0500)
committerjeresig <jeresig@gmail.com>
Wed, 6 Jan 2010 00:48:16 +0000 (19:48 -0500)
src/ajax.js
test/data/json.php
test/unit/ajax.js

index 91519d2..6d4026b 100644 (file)
@@ -557,6 +557,7 @@ jQuery.extend({
        httpData: function( xhr, type, s ) {
                var ct = xhr.getResponseHeader("content-type"),
                        xml = type === "xml" || !type && ct && ct.indexOf("xml") >= 0,
+                       json = type === "json" || !type && ct && ct.indexOf("json") >= 0,
                        data = xml ? xhr.responseXML : xhr.responseText;
 
                if ( xml && data.documentElement.nodeName === "parsererror" ) {
@@ -578,7 +579,7 @@ jQuery.extend({
                        }
 
                        // Get the JavaScript object, if JSON is used.
-                       if ( type === "json" ) {
+                       if ( json ) {
                                // Try to use the native JSON parser first
                                try {
                                        data = JSON.parse( data );
index d19a417..d6e0f2f 100644 (file)
@@ -1,9 +1,13 @@
 <?php
 error_reporting(0);
+if ( $_REQUEST['header'] ) {
+       header("Content-type: application/json");
+}
+
 $json = $_REQUEST['json'];
 if($json) {
        echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
 } else {
        echo '{ "data": {"lang": "en", "length": 25} }';
 }
-?>
\ No newline at end of file
+?>
index f9f595a..b1cb486 100644 (file)
@@ -797,6 +797,25 @@ test("jQuery.ajax() - script, Remote with scheme-less URL", function() {
        });
 });
 
+test("jQuery.ajax() - json by content-type", function() {
+       expect(5);
+
+       stop();
+
+       jQuery.ajax({
+               url: "data/json.php",
+               data: { header: "json", json: "array" },
+               success: function( json ) {
+                       ok( json.length >= 2, "Check length");
+                       equals( json[0].name, 'John', 'Check JSON: first, name' );
+                       equals( json[0].age, 21, 'Check JSON: first, age' );
+                       equals( json[1].name, 'Peter', 'Check JSON: second, name' );
+                       equals( json[1].age, 25, 'Check JSON: second, age' );
+                       start();
+               }
+       });
+});
+
 test("jQuery.getJSON(String, Hash, Function) - JSON array", function() {
        expect(5);
        stop();