文章目录
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!";//使用双引号
布尔值:true、false;
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,则结果中就会删除相应的键。如果返回了其他任何值,则该值就会成为相应键的值插入到结果中。