概念
在目前的开发中,JSON是一种非常重要的数据格式,它并不是编程语言,而是一种可以在服务器和客户端之间传输的数据格式。
JSON的全称是JavaScript Object Notation(JavaScript对象符号): JSON是由Douglas Crockford构想和设计的一种轻量级资料交换格式;
但是虽然JSON被提出来的时候是主要应用JavaScript中,但是目前已经独立于编程语言,可以在各个编程语言中使用;很多编程语言都实现了将JSON转成对应模型的方式;
其他的传输格式:
XML(可扩展标记语言):在早期的网络传输中主要是使用XML来进行数据交换的,但是这种格式在解析、传输等各方面都弱于JSON,所以目前已经很
少在被使用了;
xml 被设计用来传输和存储数据(后端用自定义标签写好,浏览器获取后通过某种方式渲染加载到浏览器)
xml 和 html 的区别,html中都是预定义标签,xml中都是自定义标签(怎么定义名称都可以);
Protobuf:另外一个在网络传输中目前已经越来越多使用的传输格式是protobuf,但是直到2021年的3.x版本才支持JavaScript,所
以目前在前端使用的较少;
JSON的基础语法
JSON的顶层支持三种类型的值:
简单值:数字(Number)、字符串(String,不支持单引号)、布尔类型(Boolean)、null类型;
对象值:由key、value组成,key是字符串类型,并且必须添加双引号,值可以是简单值、对象值、数组值;
数组值:数组的值可以是简单值、对象值、数组值;
123,true //这中方式很少用到,且json中是不予许写注释的
// 数组形式
[ 100, "json", { name:"json" } ]
//对象形式
{
"name": "json",
"age": 18,
"obj": {}
}
JSON的序列化
json常用的两个方法,在ES5中引用了JSON全局对象,该对象有两个常用的方法:
stringify方法:将JavaScript类型转成对应的JSON字符串;
parse方法:解析JSON字符串,转回对应的JavaScript类型;
stringify
const obj = {
name: "json",
obj: {
name: "json"
},
arr: ["arr1", "arr2"],
// toJSON: function() {
// return "123456"
// }
}
// 1.对象转成JSON字符串
const jsonString0 = JSON.stringify(obj)
// 2.stringify第二个参数replacer
// 2.1. 传入数组: 设定哪些是需要转换,哪些不需要
const jsonString1 = JSON.stringify(obj, ["name", "friends"])
// 2.2. 传入回调函数: 类似于遍历进行设置
const jsonString2 = JSON.stringify(obj, (key, value) => {
if (key === "name") {
return value = "JSON"
}
return value
})
// 3.stringify第三参数 space 针对于每个属性前的空(string/number)
const jsonString3 = JSON.stringify(obj, null, '--'/2)
// 4.如果obj对象中有toJSON方法 则只会执行toJSON方法的返回值
parse
// JSON.parse() 方法用来解析JSON字符串
const JSONString = '{"name":"json","obj":{"name":"json"}}'
// 第二个参数 reviver 函数用以在返回之前对所得到的对象执行变换(操作)
const info = JSON.parse(JSONString, (key, value) => {
if (key === "name") {
return value = 'JSON'
}
return value
})
JSON用于深拷贝
const jsonString = JSON.stringify(obj)
const jsonParse = JSON.parse(jsonString)
//这种深拷贝方法对函数是无效的,会屏蔽函数的转换
//另外我们生成的新对象和之前的对象并不是同一个对象