引言 :我们经常会说JSON是什么? 不就是定义的一种数据格式嘛,那到底这是一种怎样的数据格式了,今天我们就来揭下这层神秘的面纱。
1.1 什么是JSON?
JSON 是存储和交换文本信息的语法,类似于 XML ,但是比 XML 更小、更快、更易解析。
- JSON 指的时 JavaScript 对象表示法(JavaScript Object Notation)。
- JSON 是轻量级的文本数据交换格式。
- JSON 独立于语言 : 使用JavaScript 语法来描述数据对象,但是JSON 仍然独立于语言和平台,JSON 解析器和 JSON 库支持许多不同的编程语言。目前非常多的动态编程语言都支持JSON(PHP、JSP 、 .NET)。
- JSON具有自我描述性,更易理解。
1.1.1 JSON 实例
{
"sites":[
{"name":"竹林学者",“url”:"zhulinxuezhe.cn"},
{"name":"google", "url" : "www.google.com"}
]
}
1.2 JSON - 转换为 JavaScript 对象
JSON 在文本格式语法上与创建 JavaScript 对象的代码相同,故无需解析器,JavaScript 程序能够使用内建的eval()函数,用JSON 数据来生成原生的JavaScript 对象。
1.3 JSON 与 XML 相比 的 相同之处 和不同之处
1.3.1 相同之处
- JSON 是纯文本
- JSON 具有”自我描述性“
- JSON 具有层级结构(值中存在值)
- JSON 可通过 JavaScript进行解析
- JSON 数据可用 AJAX 进行传输
1.3.2 不同之处
- 没有结束标签
- 更短
- 读写的速度更快
- 能够使用内建的 JavaScript eval 方法进行解析
- 使用数组
- 不使用保留字
1.4 为什么使用JSON ?
对于 AJAX 程序来说,JSON 比 XML 更快更易使用
1.4.1 使用XML
- 读取XML 文档
- 使用 XML DOM 来循环遍历文档
- 读取值并存储在变量中
1.4.2 使用JSON
- 读取JSON 字符串
- 使用 eval() 处理JSON 字符串
1.5 JSON 语法
注 : JSON 语法是JavaScript 语法的子集。
1.5.1 JSON 语法规则
- 数据在名称 / 值对中
- 数据由逗号分隔
- 大括号保存对象
- 中括号保存数组
1)名称 / 值对
- 书写规则 :"name" = "竹林学者"
- 上述语句等价于 JavaScript 语句 : name = "JavaScript"
2)值类型 :
- 数字(整数或浮点数)
- 字符串
- 逻辑值
- 数组
- 对象
- null
3) 数字
-
整型或浮点型 例如 : { "age" : 30 }
4)对象
JSON对象在大括号({})中书写 :
- 对象可以包含多个名称 / 值对
- {“name” : "竹林学者", "url" = "www.zhulinxuezhe.cn"}
- 上述语句等价于 JavaScript 语句 name = “竹林学者” url = "www.zhulinxuezhe.cn"
5)数组
数组在中括号[] 中书写 ,数组可以包含多个对象 (下边sites 是包含三个对象的数组,,每个对象代表一条关于某个网站的记录)
{
"sites" : [
{ "name" : "竹林学者", "url" : "www.zhulinxuezhe.cn" },
{ "name" : "Google" , "url" : "www.google.com" },
{“name” : "百度" , "url" : “www.baidu.com”}
]
}
6)布尔值
- { "flag" : true}
7) null
- JSON可以设置null 值 :
- { "zhulinxuezhe" : null}
1.6 JSON 使用JavaScript 语法
因为JSON 使用 JavaScript 语法,所以无需额外的软件就能处理 JavaScript 中的 JSON ,如下所示。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<h2>JavaScript 创建 JSON 对象</h2>
<p>第一个网站名称: <span id="name1"></span></p>
<p>第一个网站修改后的名称: <span id="name2"></span></p>
<script>
var sites = [
{ "name":"竹林学者" , "url":"www.zhulinxuezhe.cn" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
];
document.getElementById("name1").innerHTML=sites[0].name;
// 修改网站名称
sites[0].name="竹林商学院";
document.getElementById("name2").innerHTML=sites[0].name;
</script>
</body>
</html>
运行结果 :
1.8 JSON 文件
- JSON 文件的文件类型是 ".json"
- JSON 文本的 MIME 类型是 "application/json"
1.7 JSON 对象
1.7.1 实例 :
{ "name" : "zhulinxuezhe" , "alexa" : "10000" , "site" : null}
- JSON 对象使用在大括号 {} 中书写
- 对象可以包含多个 key/value (键/值)对
- key 必须是字符串 , value 可以是合法的JSON 数据类型 (字符串,数字。对象,数组,布尔值,null)
- key 和 value 使用 冒号 (:)分割
- 每个 key/value 对 使用逗号(,)分割
1.7.2 如何访问对象值
可以使用(.) 来访问对象的值 :
var myObj , x;
myObj = { "name" : "zhulinxuezhe" , "alexa" : "10000" , "site" : null};
x = myObj.name;
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<p>你可以使用点号(.)来访问 JSON 对象的值:</p>
<p id="demo"></p>
<script>
var myObj, x;
myObj = { "name":"zhulinxuezhe", "alexa":10000, "site":null };
x = myObj.name;
/*
也可以通过这样来访问对象的值
x = myObj["name"];
*/
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
结果 :
1.7.3 循环对象 :
1)使用 for - in 来循环对象的属性 :
RUNOOB.COM
zhulinxuezhe
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<p>使用 for-in 来循环对象的属性:</p>
<p id="demo"></p>
<script>
var myObj = { "name":"zhulinxuezhe", "alexa":10000, "site":null };
for (x in myObj) {
document.getElementById("demo").innerHTML += x + "<br>";
}
</script>
</body>
</html>
结果 :
2)在for-in 循环对象的属性时,使用中括号([])来访问属性的值 :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<p>在 for-in 循环对象的属性时,使用中括号([])来访问属性的值:</p>
<p id="demo"></p>
<script>
var myObj = { "name":"zhulinxuezhe", "alexa":10000, "site":null };
for (x in myObj) {
document.getElementById("demo").innerHTML += myObj[x] + "<br>";
}
</script>
</body>
</html>
结果 :
1.7.4 嵌套 JSON 对象
JSON 对象中可以包含另一个 JSON 对象 :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<p>访问 JSON 内嵌对象。</p>
<p id="demo"></p>
<script>
myObj = {
"name":"zhulinxuezhe",
"alexa":10000,
"sites": {
"site1":"www.zhulinxuezhe.cn",
"site2":"m.zhulinxuezhe.cn",
"site3":"n.zhulinxuezhe.cn"
}
}
document.getElementById("demo").innerHTML += myObj.sites.site1 + "<br>";
// 或者
document.getElementById("demo").innerHTML += myObj.sites["site1"];
</script>
</body>
</html>
结果 :
1.7.5 修改删除值
- myObj.sites.site1 = "www.google.com"; 或者 myObj.sites["site1"] = "www.google.com";
- delete myObj.sites.site1; 或者 delete myObj.sites["site1"]
1.8 JSON 数组 :
- JSON 数组在中括号中书写
- 数组中值必须是合法的数据类型,(字符串、数字、对象、数组、布尔值、null)
- JavaScript中,数组值可以是以上的 JSON 数据类型,也可以是JavaScript 表达式,包括 函数,日期,及 undefined
1)三种形式访问 数组
- 通过索引值访问数组
- 通过 for-in 访问数组
- 通过 for 循环访问数组
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<p>访问 JSON 对象数组值。</p>
<p id="demo"></p>
<script>
var myObj, x;
myObj = {
"name":"网站",
"num":3,
"sites":[ "Google", "zhulinxuezhe", "Taobao" ]
}
/* 使用索引来访问数组 */
x = myObj.sites[0];
/*
使用 for-in 来访问数组
for (i in myObj.sites) {
x += myObj.sites[i] + "<br>";
}
*/
/* 使用for循环访问数组
for (i = 0; i < myObj.sites.length; i++) {
x += myObj.sites[i] + "<br>";
}
*/
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
2)嵌套JSON 对象中的数组
通过采用for-in 来循环访问每个数组,外层嵌套内层。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<p>循环内嵌数组:</p>
<p id="demo"></p>
<script>
var myObj, i, j, x = "";
myObj = {
"name":"网站",
"num":3,
"sites": [
{ "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻译" ] },
{ "name":"zhulinxuezhe", "info":[ "竹林学者", "竹林官方", "竹林公众号" ] },
{ "name":"Taobao", "info":[ "淘宝", "网购" ] }
]
}
for (i in myObj.sites) {
x += "<h1>" + myObj.sites[i].name + "</h1>";
for (j in myObj.sites[i].info) {
x += myObj.sites[i].info[j] + "<br>";
}
}
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
3)修改,删除数组元素
- myObj.sites[1] = "github";
- delete myObj.sites[1];
1.9 JSON.parse()
- JSON 通常用于与服务端交换数据
- 在接收服务端数据时一般是字符串
- 通过使用JSON.parse() 方法将数据转换为 JavaScript 对象
1.9.1 语法格式
JSON.parse(text[,reviver])
- text : 必须 ,一个有效的 JSON 字符串
- reviver : 可选, 一个转换结果的函数,将为对象的每个成员调用此函数。
1.9.2 实例展示 :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<h2>从 JSON 对象中创建 JavaScript 对象</h2>
<p id="demo"></p>
<script>
var obj = JSON.parse('{ "name":"zhulin", "alexa":10000, "site":"www.zhulinxuezhe.cn" }');
document.getElementById("demo").innerHTML = obj.name + ":" + obj.site;
</script>
</body>
</html>
1.9.3 从服务端接受 JSON 数据
我们使用AJAX 从服务器请求JSON 数据,并接解析为 JavaScript 对象。
实例代码 :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<h2>使用 XMLHttpRequest 来获取文件内容</h2>
<p>文件内容是标准的 JSON 格式,可以使用 JSON.parse 方法将其转换为 JavaScript 对象。</p>
<p id="demo"></p>
<script>
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
/* 解析从服务端接收的JSON 数据 */
myObj = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myObj.name;
}
};
xmlhttp.open("GET", "/try/ajax/json_demo.txt", true);
xmlhttp.send();
</script>
<p>查看 JSON 文件数据 <a href="/try/ajax/json_demo.txt" target="_blank">json_demo.txt</a></p>
</body>
</html>
1.9.4 异常 (JSON.parse(text)) 或者 (JSON. stringfy(text))此处 parse 和 stringfy使用一致
JSON 不能存储Data 对象 /函数 ,如果要存储Data 对象 /函数,则需要将其转换为字符串,之后在转为 Data 对象 /函数。
Data :
var text = '{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}';
var obj = JSON.parse(text);
obj.initDate = new Date(obj.initDate);
document.getElementById("demo").innerHTML = obj.name + "创建日期: " + obj.initDate;函数 :(不建议使用)
var text = '{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}';
var obj = JSON.parse(text);
obj.alexa = eval("(" + obj.alexa + ")");
document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();
1.10 JSON.stringify()
JSON 通常用于与服务端交换数据,而在向服务端发送数据时一般是字符串,可以通过JSON.stringfy() 方法将 JavaScript 对象转换为字符串。
语法 格式 :
JSON.stringfy( value [ , replacer [ , space ] ] )
参数说明 :
value : 必须 ,需要转换的JavaScript 值 (通常为对象或数组)
replacer :可选,用于转换结果的函数或数组,
space : 可选,文本添加缩进、空格和换行符。
1.10.1 JavaScript 对象转换
代码实例 :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<h2>将 JavaScript 对象转换为 JSON 字符串</h2>
<p id="demo"></p>
<script>
var obj = { "name":"zhulinxuezhe", "alexa":10000, "site":"www.runoob.com"};
/* 将数据转换为字符串 */
var myJSON = JSON.stringify(obj);
document.getElementById("demo").innerHTML = myJSON;
</script>
</body>
</html>
1.10.2 JavaScript 数组转换
var arr = [ "Google", "Runoob", "Taobao", "Facebook" ];
var myJSON = JSON.stringify(arr);
document.getElementById("demo").innerHTML = myJSON;
1.11 JSON 使用
JSON 最常见的用法 之一 ,就是从web 服务器 读取JSON 数据,(作为文本或作为 HttpRequest),将JSON 数据转换为 JavaScript 对象,然后在网页中使用该数据。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>竹林学者</title>
</head>
<body>
<h2>从 JSON 字符串中创建对象</h2>
<p>
网站名: <span id="name"></span><br>
网站地址: <span id="url"></span><br>
</p>
<script>
var txt = '{ "sites" : [' +
'{ "name":"竹林学者" , "url":"www.zhulinxuezhe.cn" },' +
'{ "name":"google" , "url":"www.google.com" },' +
'{ "name":"微博" , "url":"www.weibo.com" } ]}';
var obj = eval ("(" + txt + ")");
document.getElementById("name").innerHTML=obj.sites[0].name
document.getElementById("url").innerHTML=obj.sites[0].url
</script>
</body>
</html>
通过 JavaScript 的 eval() 函数,将JSON 文本转换为JavaScript 对象,但是 必须将文本包围在括号中,避免语法错误。