你必须知道的SON

JOSN的可以表示为以下三种类型

  • 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串,数值,Boolean和null,但是不支持undefined.
  • 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对,每个键值对可以是简单值,也可以是复杂数据类型的值.
  • 数组:数组也是一种复杂数据类型,表示的是一组有序值得列表,可以通过数值索引来访问其中得值,数组可以是任意类型-简单值,数组,对象.(我们通常要将被序列化的对象写成数组形式,为了便于访问)

简单值:简单值与JavaScript的区别为字符串类型必须加双引号(单引号会导致语法错误),没有undefined.

对象:与JavaScript的对象相比,JSON对象没有声明变量(JSON没有变量的含义),其次,没有末尾的分号(因为不是JavaScript语句,所以不需要加分号),属性名必须使用双引号括起来,示例:

{
 "name":"json",
 "age":23,
 "school":{
 		"name":"JSON",
 		"profession":"student"
 	}
}

注意:这个对象虽然有两个"name"属性,但是由于它们分别属于不同对象,所以这样完全没有问题,但是一个对象中不应该有两个相同的属性名.

数组
JOSN中的第二种复杂数据类型是数组,JSON数组采用的是JavaScript数组字面量形式:

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

而在JSON中,可以采用同样的语法表示一个数组

[25,"hi",true]

解析与序列化
JSON对象有两个方法:stringify()和parse(),在最简单的情况下,这两个对象分别用于把JavaScript对象序列化为JSON字符串,和把JSON字符串解析成JavaScript值.例如:

var book={
	title:"json",
	authors:[
		"su"
	],
	edition:3,
	year:2019
};
//序列化
var jsonText=JSON.stringify(book);
//解析
var bookCopy=JSON.parse(jsonText);

序列化选项

实践上,JSON.stringify()除了要序列化的对像外,还可以接收两个参数,这两个参数用于指定以不同的方式序列化JavaScript对象.第一个参数是过滤器.可以是一个数组也可以是一个函数,第二个参数是一个选项,表示是否在JSON字符串中保留缩进.

过滤器

  • 如果过滤器是一个数组,那么JSON.stringify()的结果将只包含数组中列出的结果.
  • 如果第二个参数是函数,行为会稍微不同,传入的函数接收两个参数,属性名和属性值.根据属性名可以知道如何处理要序列化的对象的属性.属性名只能是字符串.而在值并非是键值对结构的值时,可以是空字符串.为了改变要序列化对象的结果,函数返回的值就是相应键的值,如果返回了undefined,那么属性会被忽略(删除).

字符缩进
JSON.stringify()的第三个参数用于控制结果中的缩进和空白符,如果参数表示为一个数值,那么它比表示的是每个级别缩进的空格数,例如缩进四个空格:

var jsonText=JSON.stringify(book,null,4);

只要传入有效的控制缩进的参数量(小于等于10),结果字符串中就会包含换行符.

如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符串,其参量也是小于等于10,大于10的将自动读取前10位.

解析选项
JSON.parse()方法也可以接收一个参数,该参数是一个函数,将在每个键值对上调用,此函数被称为还原函数
如果还原函数返回undefined,则表示要从结果中删除对应的键,如果返回其他值,则将该值插入到结果中.

toJOSN()方法
有时候,JSON.stringify()不能满足对某些对象进行自定义序列化的需求,在这些情况下,可以给对象定义toJSON()方法.返回其自身的JSON数据格式.

实例解析:

var book={
			"title":"javascript",
			"authors":"english man",
			"edition":3,
			"year":2011
		};
		var jsonText=JSON.stringify(book,["title","year"],"- -");
		console.log(jsonText);
		console.log("----------------");
		var jsonText1=JSON.stringify(book,function(key,value){
			//switch不加break将向下执行
			switch(key){
				case "title":
				return "json";
				case "year":
				return 2019;
				//如果返回undefined,此属性会被删除
				case "edition":
				return undefined;
				default:
				return value;
			}
			//此函数并不会在每个键值对上调用,如歌写成此格式,那么将会显示 undefined
			/*if (key=="title") {
				return "json";
			}else if (key=="year") {
				return 9102;
			}*/
		},2);
		//设置了字符串缩进后,将不能使用parse()的还原函数,显示为语法错误,字符异常
		console.log(jsonText1);
		var jsonText2=JSON.stringify(book);
		var bookCopy=JSON.parse(jsonText1,function(key,value){
			if (key=="title") {
				return "JSON";
			}else{
				return value;
			}
		});
		console.log(bookCopy);

		console.log("----------------")

		var book1={
			"title":"javascript",
			"authors":"english man",
			"edition":3,
			"year":2011,
			toJSON:function(){
				return this.title;
			}
		};
		var jsonText3=JSON.stringify(book1);
		console.log(jsonText3);

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值