JSON是一种轻量级的数据格式,可以方便地表示复杂数据结构。
JSON是JavaScript的严格子集,利用JavaScript中的几种模式来表示结构的数据。
理解JSON的关键点是把它当作一种数据格式,而不是编程语言。JSON格式更简洁,JavaScript支持也更好,更重要的是,所有浏览器已经原生支持全局JSON对象
1、JSON语法支持三种类型的值
1、简单值:字符串、数值、布尔值和null,特殊值undefined不可以
2、对象:第一种复杂数据类型,对象表示有序键值对。每个值可以是简单值也可以是复杂类型
3、数组:第二种复杂数据类型,数组表示可以通过数值索引访问的值的有序列表,数组的值可以是任意类型,包括简单值、对象、甚至其他数组
注意点:JSON没有变量、函数或对象实列的概念
JavaScript字符串与JSON字符串的主要区别是,JSON字符串必须使用双引号(单引号会导致语法错误)
2、JSON中 的对象必须使用双引号把属性名包围起来
例如:
JavaScript创建对象
let obj = {
name:'zs',
age:10
}
JSON创建对象
let obj = {
"name":"zs",
"age":10
}
3、解析与序列化
JSON可以直接被解析成可用的JavaScript对象,与解析为DOM文档的xml相比,这个优势非常明显,这就是为什么JSON大受JavaScript开发者的喜爱。
JSON对象有两个方法,stringify()和parse()。在简单的情况下,这两个方法分别可以将JavaScript序列化为JSON字符串,以及将JSON解析为原生JavaScript值
例如:
let book = {
title:'a flying pig',
authors:'zs',
year:2021,
publish:'jiangsu dega publisher'
}
let jsonText = JSON.stringify(book)
console.log(jsonText,'jsonText');
用JSON.stringify()把一个JavaScript对象序列化为一个JSON字符串,保存在变量jsonText 中。默认情况下,JSON.stringify()会输出不包含空格或缩进的JSON字符串,因此jsonText 的值是这样的
JSON字符串可以直接传给JSON.parse(),然后得到相应的JavaScript值
例如:
let book = {
title:'a flying pig',
authors:'zs',
year:2021,
publish:'jiangsu dega publisher'
}
let jsonText = JSON.stringify(book)
let bookcopy = JSON.parse(jsonText)
console.log(bookcopy,'bookcopy');
注意book 和bookcopy是两个完全不同的对象,没有任何关系,但是它们拥有相同的属性和值,如果给JSON.parse()传入的JSON字符串无效,则会导致抛出错误。
4、系列化选项
JSON.stringify()方法除了要序列化的对象,还可以接收两个参数,这两个参数可以用于指定其他序列化JavaScript对象的方式。第一个参数是过滤器,可以是数组或函数。第二个参数是用于缩进结果JSON字符串的选项。
1.过滤结果
如果第二个参数是一个数组,JSON.stringify()返回的结果只包含该数组中列出的对象属性
let book = {
title:'a flying pig',
authors:'zs',
year:2021,
publish:'jiangsu dega publisher'
}
let jsonText = JSON.stringify(book,["title","year"])
console.log(jsonText,'jsonText');
JSON字符串只会包含这两个属性
如果第二个参数是一个函数,提供的函数接收两个参数,属性名(key)和属性值(value)。可以根据这个key决定要对相应属性执行什么操作。这个key始终是字符串,只是在值不属于某个键值对时会是空字符串。
为了改变对象的序列化,返回的值就是相应key应该包含的结果,注意,返回undefined会导致属性被忽略。
let book = {
title: 'a flying pig',
authors: ['zs', 'ls'],
year: 2021,
publish: 'jiangsu dega publisher',
}
let jsonText = JSON.stringify(book, (key, value) => {
switch (key) {
case 'authors':
return value.join(',')
case 'year':
return 5000
case 'publish':
return undefined
default:
return value
}
})
console.log(jsonText, 'jsonText')
5、解析选项
JSON.parse()方法也可以接收一个额外的参数,这个函数会针对每个键值对都调用一次。为区别于传给JSON.stringify()的起过滤作用的替代函数,这个函数被称为还原函数。实际上它们的格式完全一样,即还原函数也接收两个参数,属性名(key)和属性值(value),也需要返回值。
如果还原函数返回undefined,则结果中就会删除相应的键。如果返回了其他任何值,则该值就会成为相应键的值插入到结果中。还原函数经常用在把日期字符串转换为Date对象。
例如:
let book = {
title: 'a flying pig',
authors: ['zs', 'ls'],
year: 2021,
publish: 'jiangsu dega publisher',
releaseDate:new Date(2021,11,26)
}
let jsonText = JSON.stringify(book)
let bookcopy = JSON.parse(jsonText,(key,value)=>key=="releaseDate"?new Date(value):value
)
alert(bookcopy.releaseDate.getFullYear())