谈谈 JSON 的理解,序列化、反序列化 以及 实现深拷贝!!!

284 阅读3分钟

什么是JSON?

在我们写项目的时候,客户端向服务器发送请求,之后,服务器会给客户端响应需要的数据。

服务器可以给客户端响应一种 JSON 的数据格式。

JSON(JavaScript Object Notation)是一种对象描述符,是一种基于文本的数据交换格式。可以被任何语言读取或者作为数据格式来传递。

在前端开发中,可以使用 JSON 进行客户端与服务器之间通信。是目前最常用的数据格式。

JSON 支持的数据类型有哪些?

JSON并不是JS对象。JSON是与js对象有区别的!!!

JSON 的语法是基于js的,但JSON与JS对象并不是一回事。

JSON 中的对象格式更加严格。

JSON 支持的数据类型有:Number、string、Boolean、Objest、Array、null。

JSON 中属性值不支持Function、NaN、underfine形式。

JSON 中的数据必须由逗号隔开,对象中的键必须由“”包起来。

JSON 中没有注释。

所以大多数JS对象的语法是不符合JSON对象的格式的。

JS 数据结构与 JSON 格式之间的转换!

js 中提供了 JSON.stringify() 和 JSON.parse() 这两个函数,来实现 js 数据结构和 JSON 格式的转换处理。

JSON.stringify()

在前端向后端发sing数据时,调用 JSON.stringify() 可以将一种数据结构转换成一个 JSON 字符串。就算传入的数据格式不符合JSON格式,在进行序列化的时候会对这些数据进行特殊处理使其规范化。

什么是序列化?

项目中如果需要将一个对象存储到硬盘上,那么怎么进行存储呢?

我们在运行一个程序的时候,对象是存储在内存中的,当程序运行结束或者断电之后,内存上的数据就没有了,所以我们可以通过 window.localStorage(key,Value) 将一个js 对象存储到硬盘上。

那么,问题来了。在我们尝试把JS对象存储到local Storage中时,local Storage中只能存储字符串,所以传入的obj会调用toString方法转成字符串,最终会转换成 '[object object]',这个结果并不是我们想要的。

    let obj={name:'az'}
    console.log(obj); // {name: 'az'}
    window.localStorage.setItem("obj",obj)

image.png

所以,此时我们需要把obj对象转化层JSON 串之后,在进行存储,这个过程就叫做序列化

    let obj={name:'az'}
    let objstr=JSON.stringify(obj);
    console.log(objstr); // {"name":"az"}
    console.log(typeof objstr); // string
    window.localStorage.setItem("obj",objstr)

运行结果如下:

image.png 这样我们就成功的将对象存储到了硬盘上了。

JSON.parse()

在后端在就收到JSON格式之后,通过 JSON.parse() 可以实现将JSON格式的字符串转换成一个js数据类型。若传入的不是JSON格式的数据,就会报错。

什么是反序列化?

前面了解了什么是序列化,那么反序列化就好理解了!

反序列化 就是通过JSON.parse() 把JSON串还原成JS对象

    let obj = {name:'az'}
    let objstr=JSON.stringify(obj);
    window.localStorage.setItem("obj",objstr)
    let str=window.localStorage.getItem("obj",objstr);
    console.log(str); // {"name":"az"}
    console.log(typeof str); // string

    let obj1=JSON.parse(str);
    console.log(obj1); // 对象 

输出结果如下:

image.png

image.png

利用JSON 实现深拷贝

    let obj = { name: 'az' }

    let objstr = JSON.stringify(obj);
    let newobj=JSON.parse(objstr);
    
    obj.name="asdf";
    console.log(newobj.name); // az
    console.log(obj.name); // asdf