一、json语法
json的语法可以表示以下三种类型的值
- 简单值:可以在json中表示字符串、数值、布尔值和null。但json不支持undefined
- 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对
- 数组:数组的值可以是任意类型—简单值、对象或数组
1.简单值
json简单值数据:5 “hello world”
JavaScript字符串和json字符串最大的区别在于,json字符串必须使用双引号。
2.对象
json中的对象与JavaScript字面量稍微有一些不同。下面是一个JavaScript中的字面量:
var person = {
name:"Nicholas",
age:29
};
json表示上述对象的方式如下:
{
"name":"Nicholas",
"age":29
}
与JavaScript的对象字面量相比,json对象有两个地方不一样。首先没有声明变量(json中没有变量的概念)。
其次,没有末尾的分号(json末尾不需要分号)。json的对象属性必须加上双引号,这在json中时必须的。
//属性的值可以是简单值,也可以是复杂类型值,因为可以像下面这样在对象中嵌入对象:
{
"name":"Nicholas",
"age":29,
"school":{
"name":"Merrimack College",
"location":"North Andover, MA"
}
}
//这个例子在顶级对象中嵌入了学校信息。虽然有两个"name"属性,但由于它们分别属于不同的对象,因此这样完全没问题。不过同一个对象绝对不应该出现两个同名属性。
3.数组
json中的第二复杂数据类型是数组。json数组采用的就是JavaScript中的数组字面量形式。
//例如,下面是JavaScript中的数组字面量:
var values = [25,"hi",true];
//在json中,可以采用同样的语法表示同一个数组:
[25,"hi",true]
二、解析与序列化
json之所以流行,拥有与JavaScript类似的语法并不是全部原因。更重要的一个原因是,可以把json的数据结构解析为有用的JavaScript对象。在解析JavaScript对象后,只需要下面一行简单的代码就可以取得第三本书的书名:books[2].title
JSON.parse和JSON.stringify
json对象有两个方法,stringify()和parse(),在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为json字符串和把json字符串解析为原生JavaScript值。例如:
//book对象为JavaScript型对象
var book = {
title: "Professional JavaScript",
authors:[
"Nicholas C .zakas"
],
edition:3,
year:2011
};
//把一个JavaScript对象序列化为一个json字符串,保存在jsonText中
var jsonText = JSON.stringify(book);
/*保存在jsonText中的字符串如下:
{"title":"Professional JavaScript","authors":["Nicholas C .zakas"],"edition":3,"year":2011}*/
//将json字符串直接传递给json.parse()就可以得到相应的JavaScript值。
var bookCopy = JSON.parse(jsonText);
//注意,虽然book与bookCopy具有相同的属性,但是它们是两个独立的,没有任何关系的对象
//JSON.parse()的字符串不是有效的JSON,该方法会抛出错误
三、小结
json是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量。json使用JavaScript语法的子集表示对象、数组、字符串、数组、布尔值和null。即使XML也能表示同样复杂的数据结果,但json没有那么繁琐,而且在JavaScript中使用更便利。
js对象和json对象可以相互转换
json字符串 = JSON.stringify(js对象);
js对象 = JSON.parse(json字符串);