Detect JSON Ajax requests by the response content-type (like is done with XML). Fixes #5709.

This commit is contained in:
Rick Waldron 2010-01-05 19:48:16 -05:00 committed by jeresig
parent 230614b4df
commit 787f271052
3 changed files with 26 additions and 2 deletions

View file

@ -557,6 +557,7 @@ jQuery.extend({
httpData: function( xhr, type, s ) { httpData: function( xhr, type, s ) {
var ct = xhr.getResponseHeader("content-type"), var ct = xhr.getResponseHeader("content-type"),
xml = type === "xml" || !type && ct && ct.indexOf("xml") >= 0, xml = type === "xml" || !type && ct && ct.indexOf("xml") >= 0,
json = type === "json" || !type && ct && ct.indexOf("json") >= 0,
data = xml ? xhr.responseXML : xhr.responseText; data = xml ? xhr.responseXML : xhr.responseText;
if ( xml && data.documentElement.nodeName === "parsererror" ) { if ( xml && data.documentElement.nodeName === "parsererror" ) {
@ -578,7 +579,7 @@ jQuery.extend({
} }
// Get the JavaScript object, if JSON is used. // Get the JavaScript object, if JSON is used.
if ( type === "json" ) { if ( json ) {
// Try to use the native JSON parser first // Try to use the native JSON parser first
try { try {
data = JSON.parse( data ); data = JSON.parse( data );

View file

@ -1,9 +1,13 @@
<?php <?php
error_reporting(0); error_reporting(0);
if ( $_REQUEST['header'] ) {
header("Content-type: application/json");
}
$json = $_REQUEST['json']; $json = $_REQUEST['json'];
if($json) { if($json) {
echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]'; echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
} else { } else {
echo '{ "data": {"lang": "en", "length": 25} }'; echo '{ "data": {"lang": "en", "length": 25} }';
} }
?> ?>

View 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() { test("jQuery.getJSON(String, Hash, Function) - JSON array", function() {
expect(5); expect(5);
stop(); stop();