语法
JSON的语法可以表示以下三种类型的值。
简单值:使用与javaScrpt相同的语法,可以在JSON中表示字符串,数值,布尔值和null。但JSON不支持JavaScript中的特殊值unfedined。
对象:对象作为一种复杂数据类型,表示的是一组有序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。
数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值,数组的值也可以是任意类型-简单值,对象或数组。
JSON不支持变量,函数或对象实例,它就是一种表示结构化数据的格式,虽然与JavaScript中表示数据的某些语法相同,但它并不局限于JavaScript的范畴。
简单值最简单的JSON数据形式就是简单值,例如 1 这是JSON表示数值是1的方式,类似地,下面是JSON表示字符串的方式:
"Hello world!"
JavaScript字符串与JSON字符串最大区别在于,JSON字符串必须使用双引号(单引号有语法错误)。
布尔值和null也是有效的JSON形式,但是,在实际应用中,JSON更多地用来表示更复杂的数据结构,而简单值只是数据结构的一部分。
对象
JSON中的对象与JavaScript字面量稍微有一些不同。下面是一个JavaScript中的对象字面量;
var person={ name="张三", age=19 };JSON表述对象的方式如下:
{
"name"="张三",
"age"=19
}
与上面的对象字变量相比,JOSN对象有两个地方不一样。首先,没有声明变量(JSON中没有变量的概念)。其实没有末尾的分号,再说一遍,对象的属性必须加双引号,属性的值可以是简单值,也可以是复杂类型值,因此可以像下面这样在对象中嵌入对象:
{
"name"="张三",
"age"=19,
"scchool":{
"name":"MIT",
"address":"北京新东方"
}
}
这个例子在定级对象中嵌入了学校信息,虽然有两个name,但是属于不同的对象,因此这样完全没有问题。
数组
JSON中的第二种复杂数据类型是数组,JOSN数组采用的就是JAVAScript中的数组字面量形式,如下面是JavaScript中的数组字面量;
var values=[23,'a',true];在JSON中,可以采用同样的语法表示同一数组:
[25,'a',true]
解析与序列化JSON之所以流行,拥有与JS类似的语法并不是全部原因,更重要的原因是JSON可以被解析为有用的JS对象,
JOSN对象早期的JSON解析器基本上就是使用JavaScript的eval()函数。由于JSON是JavaScript的语法子集,因此eval()函数可以解析,解释并返回JavaScript对象和数组、ECMAScript对解析JSON的行为进行规范,定义了JSON对象。
JSON对象有两个方法,stringify()和parse();这两个方法分别用于把javaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。
parse用于从一个字符串中解析出json对象,如
var str = '{"name":"zhangsan","age":"23"}'
结果:
JSON.parse(str)
Object
stringify()用于从一个对象解析出字符串,如
var a = {a:1,b:2}
结果:
JSON.stringify(a)
"{"a":1,"b":2}"
序列化选项实际上,JSON.stringify()除了要序列化JavaScript对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化JavaScript对象,第一个参数是个过滤器,可以是一个数组,也可以是一个数组;第二个参数是一个选项,表示是否在JSON字符串中保留缩进,单独或组合使用这两个参数,可以更全面深入地控制JSON序列化。
var book={"title":"javaScript", "authors":["Nicholas c.zaks" ], edition:3, year:2011 }; var jsonText=JSON.stringify(book,["title","edition"]); alert(jsonText);这样打印出的结果就是包含title和edition的;
2.字符串缩进JSON.stringify()方法的第三个参数用于控制结果中的随进和空白符,如果这个参数是一个数值,那么它表示我们缩进的级别;
var jsonText=JSON.stringify(book,["title","edition"],2);比如这里传入一个2,那么就会缩入2格;
toJSON()方法有的时候JSON.stringify()方法还是不能满足某些对象自定义序列化的需求。在这些情况下可以通过对象调用这个方法,返回其自身的JOSN数据格式。
var book={"title":"javaScript",
"authors":["Nicholas c.zaks"
],
edition:3,
year:2011,
toJSON:function(){
return this.title;
}
};
alert(book.toJSON());
这里toJSON()的方法,返回图书的书名,如果我们使用JSON.stringify()方法序列字符串的时候,有的字符串不能正常的序列化,或者需要一些特殊的序列化,比如这里想把返回的值固定一下为undefined都是可以的;
toJSON()可以作为函数过滤器的补充,因此理解序列化内部顺序就十分重要;
序列化该对象的顺序如下:1.如果存在toJOSN()方法而且能通过它取得有效的值,则调用该方法,否则按照默认加载顺序序列化。
2.如果有第二个参数,应用这个函数过滤器。传入函数过滤器的值是第1步返回的值。
3.对第2步返回的每个值进行对应的序列化。
4.如果提供了第三个参数,执行相应的格式化。
解析选项