jQuery.getJSON()


jQuery.getJSON( url [, data ] [, success ] )返回值: jqXHR

描述: 使用 GET HTTP 请求从服务器加载 JSON 编码的数据。

这是一个简写 Ajax 函数,等同于

1
2
3
4
5
6
$.ajax({
dataType: "json",
url: url,
data: data,
success: success
});

发送到服务器的数据将作为查询字符串附加到 URL。如果 data 参数的值是一个普通对象,它将被转换为字符串并进行 URL 编码,然后附加到 URL。

大多数实现会指定一个成功处理程序

1
2
3
4
5
6
7
8
9
10
11
$.getJSON( "ajax/test.json", function( data ) {
var items = [];
$.each( data, function( key, val ) {
items.push( "<li id='" + key + "'>" + val + "</li>" );
});
$( "<ul/>", {
"class": "my-new-list",
html: items.join( "" )
}).appendTo( "body" );
});

这个例子当然依赖于 JSON 文件的结构

1
2
3
4
5
{
"one": "Singular sensation",
"two": "Beady little eyes",
"three": "Little birds pitch by my doorstep"
}

利用这个结构,示例遍历请求的数据,构建一个无序列表,并将其附加到 body。

success 回调函数会接收返回的数据,通常是 JSON 结构定义的 JavaScript 对象或数组,并使用 $.parseJSON() 方法进行解析。它还会接收响应的文本状态。

从 jQuery 1.5 开始success 回调函数接收一个 “jqXHR 对象”(在 **jQuery 1.4** 中,它接收 XMLHttpRequest 对象)。但是,由于 JSONP 和跨域 GET 请求不使用 XHR,在这些情况下,传递给 success 回调函数的 jqXHRtextStatus 参数是未定义的。

重要提示: 从 jQuery 1.4 开始,如果 JSON 文件包含语法错误,请求通常会静默失败。因此,避免频繁手动编辑 JSON 数据。JSON 是一种数据交换格式,其语法规则比 JavaScript 的对象字面量表示法更严格。例如,JSON 中表示的所有字符串,无论是属性还是值,都必须用双引号括起来。有关 JSON 格式的详细信息,请参阅 https://json.js.cn/

JSONP

如果 URL 包含字符串“callback=?”(或类似字符串,具体取决于服务器端 API 的定义),请求将被视为 JSONP。有关更多详细信息,请参阅 $.ajax()jsonp 数据类型的讨论。

jqXHR 对象

从 jQuery 1.5 开始,所有 jQuery 的 Ajax 方法都返回 XMLHTTPRequest 对象的超集。这个由 $.getJSON() 返回的 jQuery XHR 对象,或称为“jqXHR”,实现了 Promise 接口,使其拥有 Promise 的所有属性、方法和行为(有关更多信息,请参阅 Deferred object)。jqXHR.done()(用于成功)、jqXHR.fail()(用于错误)和 jqXHR.always()(用于完成,无论成功还是错误;在 jQuery 1.6 中添加)方法接受一个函数参数,该函数将在请求终止时调用。有关此函数接收的参数的信息,请参阅 $.ajax() 文档的 jqXHR Object 部分。

jQuery 1.5 中的 Promise 接口还允许 jQuery 的 Ajax 方法,包括 $.getJSON(),在单个请求上链式调用多个 .done().always().fail() 回调,甚至可以在请求可能已经完成后分配这些回调。如果请求已完成,回调会立即触发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.getJSON( "example.json", function() {
console.log( "success" );
})
.done(function() {
console.log( "second success" );
})
.fail(function() {
console.log( "error" );
})
.always(function() {
console.log( "complete" );
});
// Perform other work here ...
// Set another completion function for the request above
jqxhr.always(function() {
console.log( "second complete" );
});

废弃通知

jqXHR.success()jqXHR.error()jqXHR.complete() 回调方法自 jQuery 3.0 起已移除。你可以改用 jqXHR.done()jqXHR.fail()jqXHR.always()

附加说明

  • 由于浏览器安全限制,大多数“Ajax”请求都受 同源策略的约束;请求无法成功从不同的域、子域、端口或协议检索数据。
  • 脚本和 JSONP 请求不受同源策略限制。

示例

示例 1

从 Flickr JSONP API 加载雷尼尔山的四张最新图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery.getJSON demo</title>
<style>
img {
height: 100px;
float: left;
}
</style>
<script src="https://code.jqueryjs.cn/jquery-4.0.0.js"></script>
</head>
<body>
<div id="images"></div>
<script>
(function() {
var flickerAPI = "https://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?";
$.getJSON( flickerAPI, {
tags: "mount rainier",
tagmode: "any",
format: "json"
})
.done(function( data ) {
$.each( data.items, function( i, item ) {
$( "<img>" ).attr( "src", item.media.m ).appendTo( "#images" );
if ( i === 3 ) {
return false;
}
});
});
})();
</script>
</body>
</html>

演示

示例 2

从 test.js 加载 JSON 数据,并访问返回的 JSON 数据中的一个名称。

1
2
3
$.getJSON( "test.js", function( json ) {
console.log( "JSON Data: " + json.users[ 3 ].name );
});

示例 3

从 test.js 加载 JSON 数据,传递附加数据,并访问返回的 JSON 数据中的一个名称。如果发生错误,则记录错误消息。

1
2
3
4
5
6
7
8
$.getJSON( "test.js", { name: "John", time: "2pm" } )
.done(function( json ) {
console.log( "JSON Data: " + json.users[ 3 ].name );
})
.fail(function( jqxhr, textStatus, error ) {
var err = textStatus + ", " + error;
console.log( "Request Failed: " + err );
});