你不知道的JSON对象的细节

184 阅读2分钟

这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

JSON是一种轻量级的数据交换格式。

使用场景:

  1. 网络数据的传输
  2. 项目的配置文件
  3. 非关系型数据库(NoSQL)将json作为存储格式。

json顶层的数据类型

  1. 简单值:Number ,string(必须是双引号),Boolean ,null
  2. 对象:key和value,key必须是字符串,必须是双引号包裹,value可以是简单值,对象值,数组值
  3. 数组值:数组值中可以是简单值,对象值,数组值

JSON序列化

因为有时我们需要JSON格式的字符串,所以我们需要有转换方法,来实现格式的转化。

JSON.stringifg() 方法可以将javascript的数据类型,转为json格式的数据。

传入三个参数:

  1. 转换的对象

  2. replacer (过滤对象相应的键)

    1. replacer数组时,只会将数组中传入的key进行转化
    2. replacer函数时,可以对value的值进行处理后返回。
  3. space :表示每一级缩进的字符数,默认是空格,最大值为10,大于10会自动设置为10。

    也可以设置为其他字符,如tab或者--,最大的设置量也是10个。

 let obj = {
   name: "fea",
   age: 12,
   friend: {
     name: "litao",
     address: "北京市",
   },
 };
 //1.repalcer为数组
 // let jsonString = JSON.stringify(obj, ["name", "age"]);
 //2.repalcer为函数
 let jsonString = JSON.stringify(
   obj,
   (key, value) => {
     if (key == "age") {
       return value + 1;
     }
     //除了key为age时进行处理,其他的还返回默认值
     return value;
   },
   4
   //或者使用 '--'
 );
 ​

JSON.parse() 将json格式的数据转为javascript的数据类型。例如讲一个json格式的字符串对象转为js中真正的对象。

传入的参数:

  1. 需要转换的json对象
  2. reviver 函数,用于在返回之前对处理返回的值。
 let parseStr = JSON.parse(getobj, (key, value) => {
   if (key === "age") {
     return value - 1;
   }
   return value;
 });

toJSON():我们可以自定义要序列化的属性,可以在要序列化的对象上实现toJSON()方法,那么当我们使用JSON.stringfy()方法时,就会按toJSON()返回的对象进行处理。

 let obj = {
     name: "fea",
     age: 12,
     friend: {
         name: "litao",
         address: "北京市",
     },
     toJSON() {
         return {
             name: this.name,
             age: this.age,
         };
     },
 };
 ​
 let jsonString = JSON.stringify(
     obj,
     (key, value) => {
         if (key == "age") {
             return value + 1;
         }
         //除了key为age时进行处理,其他的还返回默认值
         return value;
     },
     4
     //或者使用 '--'
 );
 console.log(jsonString);
 /*{
     "name": "fea",
     "age": 13
 }*/
 ​

注意:toJSON()不能使用箭头函数。

JSON.stringfy()的执行步骤

  1. 如果对象中有实现了toJSON()方法,则处理toJSON()方法返回的值。否则默认处理整个对象。
  2. 如果传入了第二个参数,则对第一步返回的值进行过滤处理。
  3. 对过滤后的值进行序列化。
  4. 如果提供了第三个参数,则进行相应的缩进。