JSON笔记(更新ing)

1、什么是JSON?

简介

JSON:即 JavaScript Object Notation JavaScript 对象简谱,它是一种数据交换的文本格式,一种特殊格式的字符串(可以被任意语言识别),而不是一种编程语言。它是 JavaScript 的严格子集,利用 JavaScript 中的几种模式来表示结构化数据。JSON只是和 JS拥有相同的语法,但它不属于JS。

作用

web客户端和服务器通过ajax进行数据交互时常用的数据格式
JSON可以被转化为任意语言中的对象,在开发中主要用于数据的交互

2、JSON语法

JSON没有变量、函数或对象实例的概念,其语法部分地方与JS有区别

JSON 语法支持表示 3 种类型的值
简单值:字符串、数值、布尔值、null可以在JSON中出现,但不能出现undefined

复杂数据类型有两种:对象和数组、二者通常作为JSON数组的顶级结构,以便创造大型复杂数据结构

对象:表示有序键(值)对,每个值可以是简单值,也可以是复杂类型
数组:数组的值可以是任意类型,包括简单值、对象,或者其他数组。

2.1、简单值

数值:5;
字符串:"jackpot!";//使用双引号
布尔值:truefalse;
null

JSON字符串必须使用双引号

2.2、对象

JSON对象必须用双引号把属性名包括起来

	//JSON没有变量,所以不能出现变量声明
	{
		"name": "Rory",
		"Number": "201608"
		"school":{
			"pri": "S1",
			"mid": "s2",
			"name": "jw"
		}
		//JSON的对象中,允许存在相同的属性名,但是他们必须分居不同的对象
		//同一对象中不允许出现相同的属性
	}
	//JSON最后没有分号

2.3、数组

JSON中的数组被包围在[]中,不同元素间以,分隔,每个元素被包围在{}内,每个元素内或数组内最后一个元素后面不加,

[
	{
		"num": 1,
		"name": "Amy",
		"friends":[
			"Jack",
			"Doctor"
		],
		"age": 26
	},

	{
		"num": 2,
		"name": "Rory",
		"fridens":[
			"Amy",
			"Doctor"
		],
		"age": 27

	}
]

3、解析与序列化

JSON 可以直接被解析成可用的 JavaScript 对象

3.1、JSON对象

3.1.1、eval()

最好在浏览器原生不支持JSON解析时使用,而开发中尽量不要使用,因为其执行性能较差且有安全隐患

原生浏览器:从内核到界面都是由自己公司开发的浏览器,而不是基于别的浏览器核心技术开发出的衍生产品
常见原生浏览器:IE(已退役),火狐,Chrome

eval()可以解析、解释JSON对象和数组,并将其作为JavaScript对象和数组返回

	语法:eval(String);

可以执行一段字符串形式的JavaScript代码,并将执行结果返回

	let str = "alert("hello world");"//一段字符串形式的js代码
	eval(str);

如果传入的字符串有{},eval()会将{}当做代码块,为了避免eval()将其作为代码块解析,需要用()包裹传入的字符串

	let str = "{"name":"Jack","age":18}";
	let obj = eval("(" + str + ")");
	console.log(obj);
3.1.2、stringify()
序列化JavaScript对象

在简单情况下,stringify()方法可以将JavaScript序列化为JSON字符串,stringify()方法可以接收三个参数,第一个是需要序列化的对象

	语法:JSON.stringify(需要序列化的对象);

	//先声明一个js对象
	let person = {
			name: "Jack",
			age: 18,
			friends: [
				"Rory",
				"Donna"
			]
		}; 

	//用stringify()方法将这个js对象序列化为JSON字符串
	let jsonText = JSON.stringify(person);//调用JSON对象的stringify()方法
	console.log(jsonText);//在控制台打印得到的json字符串

默认情况下,JSON.stringify()会返回不包含空格和缩进的JSON字符串,所以上面得到的jsonText为:

{"name":"Jack","age":18,"friends":["Rory","Donna"]}

在JavaScript对象序列化时,所有函数和原型成员都会被刻意在结果中省略,值为undefined的任何属性会被跳过

3.1.4、parse()

在简单情况下,将JSON解析为原生JavaScript值,注意传入的JSON字符串应当有效(符合JSON自字符串的格式要求),否则会导致抛出错误

	let personCopy = JSON.parse(jsonText);

注意这里得到的personCopy与声明对象时得到的person是两个完全不同的对象,二者没有任何关系,只是有相同的属性和值。

3.2、序列化选项

JSON.stringify()除了可以接收要序列化的对象作为参数,还可以接收两个参数——过滤器缩进结果JSON字符串的选项,这些参数可以单独使用,也可以组合使用,控制JSON序列化。

3.2.1、过滤

即根据传入的第二个参数,在JSON序列化过程中过滤掉不符合第二个参数的内容,最终得到符合的内容

	//先声明一个js对象
	let person = {
			name: "Jack",
			age: 18,
			friends: [
				"Rory",
				"Donna"
			]
		}; 

1、传入的第二个参数是数组

let jsonText_1 = JSON.stringify(person, ["name","friends"]);
//代表需要序列化的对象是数组中的属性对应的内容,最终结果就只会包含数组中属性对应的内容

//序列化结果:
{"name":"Jack","friends":{"Rory","Donna"}}//序列化过程中过滤掉了属性"age"

2、传入的第二个参数是函数
函数接收两个参数—— 属性名(key)属性值(value) 。key应当是是字符串,在值不属于某个键/值时是空串。传入的函数目的是根据key的情况对相应属性执行对应操作。

	//先声明一个js对象
	let person = {
			name: "Jack",
			age: 18,
			friends: [
				"Rory",
				"Donna"
			],
			sex: "Male",
			school: "s1",
		}; 

	let jsonText_2 = JSON.stringify(person, function(key, value){
			switch(key){
				case "friends":
					return value.join(",");//将数组转化为字符串
				case "age":
					return "age"+1;
				case "school":
					return undefined;//返回值中忽略friends属性
				default:
					return value; //返回其他属性的原值
			}
		});

得到的JSON字符串:

{"name":"Jack","age":19,"friends":"Rory,Donna","sex":"Male"}
//friends对象变成了字符串,school属性被跳过,没有进入最终结果
3.2.2、字符串缩进

以上得到的JSON字符串格式不美观且阅读困难,所以可以通过传入第三个参数控制缩进和空格来更改得到的JSON字符串的格式。
1、参数为数值时,表示每一级缩进的空格数,最大应用值为10,超过10的设置值会自动以10进行应用。

凡是设置了有效的缩进参数,JSON都会自动为每一级进行换行

	//先声明一个js对象
	let person = {
			name: "Jack",
			age: 18,
			friends: [
				"Rory",
				"Donna"
			],
			sex: "Male",
			school: "s1",
		}; 
	
	let jsonText_3 = JSON.stringify(person, null, 3);//每一级缩进3个字符

得到的jsonText:

   {
      "name":"Jack",//缩进3个字符
      "age":18,
      "friends":[
         "Rory",//缩进3个字符
         "Donna"
      ],
      "sex":"Male",
      "school":"s1"
   }

缩进参数还可以设为Tab或者任意字符

1、设置为Tab(4个字符)
	let jsonText_3 = JSON.stringify(person, null, Tab);

	得到的jsonText:
	//每一级缩进Tab代表的字符数
	{
 	 	"name":"Jack",//缩进3个字符
     	"age":18,
     	"friends":[
       		"Rory",//缩进3个字符
        	"Donna"
      	],
     	"sex":"Male",
     	"school":"s1"
  	}

2、设置为任意字符串,比如"??",设置的字符串同样有效长度为10,超过10个字符的部分会被截断舍弃
	let jsonText_3 = JSON.stringify(person, null, "??");
	
		{
 	 	??"name":"Jack",//缩进3个字符
     	??"age":18,
     	??"friends":[
        ????"Rory",//缩进3个字符
        ????"Donna"
      	??],
     	??"sex":"Male",
     	??"school":"s1"
  		}
3.2.3、toJSON()

在要序列化的对象中添加toJSON()方法,可以在JSON.stringify()之上自定义JSON序列化

3.3、解析选项

JSON.parse()方法与JSON.stringify()方法类似,也可以接收另外一个参数(函数),这个函数被称为还原函数,也接收两个参数,属性名(key)和属性值(value)。如果还原函数返回 undefined,则结果中就会删除相应的键。如果返回了其他任何值,则该值就会成为相应键的值插入到结果中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六时二一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值