JSON初认识

JSON语法,解析JSON,序列化JSON

简介:曾经有一段时间,XML是互联网上传输结构化数据的事实标准。Web服务的第一次浪潮很大程度上都是建立在XML之上的,突出的特点是服务器与服务器间通信。然而,不少人认为XML过于繁琐、冗长。为解决这个问题,也涌现了一些方案。2006年,Douglas CrockFord把JSON(JavaScript Object Notation,JavaScript对象表示法)作为IETFREFC 4627提交给IETF,而JSON的应用早在2001年就已经开始了。JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据。
关于JSON,最重要的是要理解它是一种数据格式,不是一种编程语言,很多编程语言都有针对JSON的解析器和序列化器。

语法

  1. 简单值: 使用JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持JavaScript中的特殊值 undefined。
  2. 对象: 对象作为一种复杂数据类型,表示的是一组无序的键值对儿。而每个键值对儿可以是简单值,也可以是复杂数据类型。
  3. 数组: 数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型。

JSON不支持变量、函数或对象实例,它就是一种表示结构化数据的格式,虽然与JavaScript中表示数据的某些语法相同,但它并不局限于任何语言范畴。这里我觉得就能体现出JSON是一种通用的数据格式,学好了准没错!!嘻嘻

JSON字符串必须使用双引号,单引号会导致语法错误,布尔值和null也是有效的JSON形式哦!
下面是JSON表示字符串的方式:

"Hello World !"

对象

JSON中的对象与JavaScript字面量稍微有一些不同。下面是一个JavaScript中的对象字面量:

var person={
	name:"zhangsan",
	age:29
};

前面的对象字面量也可以写成这样:

var object={
	“name”:"zhangsan",
	"age":29
};

而用JSON表示上述对象如下:

{
	“name”:"zhangsan",
	"age":29
}

首先JSON中没有声明变量,其次末尾没有分号(因为这不是JavaScript语句,所以不需要分号),最后。对象的属性必须加双引号,这在JSON中实必须的!
也可以向下面这样在对象中嵌入对象:

{
	“name”:"zhangsan",
	"age":29,
	"school":{
		"name":"QingHUa",
		"location":"BeiJing
	}
}

数组

JSON数组采用的是JavaScript中的数组字面量形式,例如下面是js中的数组字面量:

var vaules=[25,"hi",true];

在JSON中,同样的方法表示数组:

[25,"hi",true]      //也没有变量和分号

把对象和数组结合起来 可以构成更复杂的数据集合例如:

[
 { "tittle":"professional JavaScript",
 	"authors": [ "zhangsan "],
 	"editions":3,
 	"year":2011
 },
  { "tittle":"professional JavaScript",
 	"authors": [ "zhangsan "],
 	"editions":2,
 	"year":2009
 }
]

序列化与解析

JSON之所以流行,最重要的一个原因是可以把JSON数据结构解析为有用的JavaScript对象。与XML数据结构要解析成DOM文档而且从中提取数据极为麻烦相比,JSON可以解析JavaScript对象的又是极为明显。

1、最早的解析器使用eval()函数
但是由于eval()对JSON数据结构求值有风险,一般不使用。

2、JSON对象有两个方法:stringify()和parse(),这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原JavaScript值

JSON.stringify()还可以在接收两个参数,这两个参数用于指定不同的方式序列化JavaScript对象。第一个参数是个过滤器,可以是一个数组也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。
1、过滤结果:

var book={
	 tittle":"professional JavaScript",
 	"authors": [ "zhangsan "],
 	"edition":3,
 	"year":2011
 }
 var jsonText=JSON.stringify(book,["tittle","edition"]);

第二个参数是一个数组,其中包含两个字符串将表示的两个属性返回在结果中:

{“tittle”:"professional JavaScript", "editions":3}

如果第二个参数是函数,传入的函数接收两个参数,属性名和属性值。
1、字符串缩进:
JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。这个参数是一个数值,他表示的是每个级别缩进的空格数。例如,要在每个级别缩进4个空格,可以这样写代码:

var book={
	 tittle":"professional JavaScript",
 	"authors": [ "zhangsan "],
 	"edition":3,
 	"year":2011
 };
 var jsonText=JSON.stringify(book,null,4);

保留在jsonText中的字符串如下所示:

{
     tittle":"professional JavaScript",
 	"authors": [ "zhangsan "],
 	"edition":3,
 	"year":2011
 }   					
 //缩进字符串不能超过10个字符,如果缩进参数而非数值,则设置这个值被用作缩进字符

3、toJSON()方法,给对象定义toJSON()方法,返回其自身的JSON数据格式。可以让toJSON()方法返回任何值。
4、JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用,这个函数被称为还原函数。如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。在日期字符串转换为Date对象时,经常要用到还原函数。例如:

{
var book={
	 tittle":"professional JavaScript",
 	"authors": [ "zhangsan "],
 	"edition":3,
 	"year":2011,
 	"releaseDate":newDate(2011,11,1)
 };
 var jsonText=JSON.stringify(book);
 var bookCopy=JSON.stringify(jsonText,function(key,value){
 		if(key=="releaseDate"){
 				return new Date(value);
 		}else{
 				return value;
 		}
 		});
 		alert(bookCopy.releaseDate.getFullYear());

以上代码先是为book对象新增了一个releaseDate属性,该属性保存着一个Date对象。这个对象在经过序列化之后变成了有效的Json字符串,然后经过解析又在bookCopy中还原为一个Date对象。还原函数在遇到“releaseDate”键时,会基于相应的值创建一个新的Date对象。结果就是bookCopy.releaseDate属性中会保存一个Date对象。正因为如此,才能基于这个对象调用getFullYear()方法。

小结

JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量。JSON 使用JavaScript语法的子集表示对象、数组、字符串、数值、布尔值和null。即使XML也能表示同样复杂的数据结果,但JSON没有那么烦琐,而且在JavaScript中使用更便利。
ECMAScript 5定义了一个原生的JSON对象,可以用来将对象序列化为JSON字符串或者将JSON数据解析为JavaScript对象。JSON. stringify ()和JSON . parse()方法分别用来实现上述两项功能。这两个方法都有一些选项,通过它们可以改变过滤的方式,或者改变序列化的过程。
原生的JSON对象也得到了很多浏览器的支持,比如IE8+、Firefox 3.5+、Safari 4+、Opera 10.5和Chrome。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值