来源:JSON 教程

一、JSON简介

  • 轻量级的文本数据交换格式

二、JSON语法

  • JavaScript对象表示语法子集
  • 数据在名称/值对中
  • 数据由逗号 , 分隔
  • 使用斜杆 \ 来转义字符
  • 大括号 {} 保存对象
    • 无序的名称/值对集合,名称/值使用逗号 , 分隔
    • 一个对象以左大括号 { 开始, 右大括号 } 结束,每个名称(“键”)后跟一个冒号 :
  • 中括号 [] 保存数组,数组可以包含多个对象
    • 值的有序集合,值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array),它们可以嵌套
    • 一个数组以左中括号 [ 开始, 右中括号 ] 结束,值之间使用逗号 , 分隔
  • JSON名称/值对
1
2
3
4
5
key : value
例如:
"name" : "thee"
等价于:
name = "thee"

三、JSON对象

JSON 对象使用在大括号 {…} 中书写。对象可以包含多个 key/value(键/值)

key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)

key 和 value 间使用冒号 : 分割;每个 key/value 对间使用逗号 , 分割

  • 访问对象值(使用for (x in json_obj)来循环访问对象属性即key(键))

    • 点号 . 访问(点号后接key(键),无需双引号)
    • 中括号 [ ] 访问(中括号内填key(键),需添加双引号)
  • 删除对象属性key(键)(delete key),同时也会删除value(值)

四、JSON数组

  • 访问数组:使用索引值(下标从0开始)

  • 循环访问数组

    • for (i in json_obj.sites)
    • for循环
  • 删除数组元素(delete ...)

五、字符串和JSON对象的转换

1.JSON.parse()

该方法将数据转换为JavaScript对象,即可以解析的JSON数据

1
2
3
4
JSON.parse(text, [reviver])
参数:
text: 有效的JSON字符串
reviver: 可选, 转换结果的函数,将为对象的每个成员调用该函数

使用AJAX从服务器请求JSON数据并解析为JavaScript对象

1
2
3
4
5
6
7
8
9
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
myObj = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myObj.name;
}
};
xmlhttp.open("GET", "/try/ajax/json_demo.txt", true);
xmlhttp.send();
  • JSON不能存储Date对象,如果确实需要存储则需要将其转换为字符串再将字符串转换为Date对象
1
2
3
4
5
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;
  • 我们可以启用 JSON.parse 的第二个参数 reviver,一个转换结果的函数,对象的每个成员调用此函数
1
2
3
4
5
6
7
8
9
var text = '{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}';
var obj = JSON.parse(text, function (key, value) {
if (key == "initDate") {
return new Date(value);
} else {
return value;
}});

document.getElementById("demo").innerHTML = obj.name + "创建日期:" + obj.initDate;
  • JSON 不允许包含函数,可以先将函数作为字符串存储,再将字符串转换为函数,但不建议在JSON中使用函数

2.JSON.stringify()

该方法将 JavaScript 对象转换为字符串数据

1
2
3
4
5
JSON.stringify(value, replacer, space)
参数:
value: 待转换的JavaScript值(JSON对象)
replacer: 可选, 用于转换结果的函数或数组。如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组
space: 可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t
  • 由于JSON不能存储Date对象,因此JSON.stringify() 会将所有日期转换为字符串
  • JSON 也不允许包含函数,JSON.stringify() 会删除 JavaScript 对象的函数,包括 key 和 value;可以在执行 JSON.stringify() 函数前将函数转换为字符串来避免,但不建议在JSON中使用函数

由于 JSON 语法是 JavaScript 语法的子集,JavaScript 函数 eval() 可用于将 JSON 文本转换为 JavaScript 对象。eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象,不过必须把文本用括号括起来,这样才能避免语法错误;eval() 函数可编译并执行任何 JavaScript 代码,但这隐藏了一个潜在的安全问题

六、JSONP

Jsonp(JSON with Padding) 是 json 的一种使用模式,可以让网页从别的域名(网站)那获取资料,即跨域读取数据(同源策略)