JSON对象及序列化

537 阅读2分钟

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

JSON对象

实际项目中有这样的一个场景:当我们跳转页面时,我们需要在把前一个页面的某些参数已对象的形式传过去,我们就可以采用把参数放在地址栏上,在目标页面就可以从地址栏上去需要的参数了。可是这里有个问题,就是地址栏不能存放对象类型,此时就可以用JSON里面的一个方法将对象类型转化。JSON有两个方法,JSON.stringify()和JSON.parse()。

JSON.stringify()

JSON.stringify()可以吧js对象类型的数据序列化成JSON字符串,上代码

  let jsonObj = {
    name: '小明',
    age: 12,
    hobby: ['游泳', '打篮球', '王者荣耀']
  }
  let jsonStr = JSON.stringify(jsonObj);
  console.log(jsonStr); //{"name":"小明","age":12,"hobby":["游泳","打篮球","王者荣耀"]}

如上所示,将jsonObj对象使用JSON.stringify()转换一下,在赋值给变量jsonStr,把jsonStr打印出来的是很纯粹的字符串;在这里,细心的你会发现对象所有的空格、换行以及缩进,全都没有保留。

JSON.stringify()还能接收两个参数,第一个参数是一个过滤器,传进去想保留的属性名字,序列化后的数据就只会保留传进参数的那些数据;

  let jsonObj = {
    name: '小明',
    age: 12,
    hobby: ['游泳', '打篮球', '王者荣耀']
  }
  let jsonStr = JSON.stringify(jsonObj, ['name', 'age']);
  console.log(jsonStr); //{"name":"小明","age":12}

如上所示,我们将属性名name和age以数组的格式传进去,打印出来的是{"name":"小明","age":12},把hobby属性给过滤掉了;由此可知,你想保留那些属性,就把这些属性传进去,保留下来的绝对是这些属性。

第二个参数是一个选项,表示在返回结果的字符串中是否保留缩进。

  let jsonObj = {
    name: '小明',
    age: 12,
    hobby: ['游泳', '打篮球', '王者荣耀']
  }
  let jsonStr = JSON.stringify(jsonObj, null, 4);
  console.log(jsonStr);
//   {
//     "name": "小明",
//     "age": 12,
//     "hobby": [
//         "游泳",
//         "打篮球",
//         "王者荣耀"
//     ]
//   }

如上所示,将jsonObj使用JSON.stringify()序列化,过滤的参数传个null进去,后面的参数传个4,打印出来的结果保留的原来的空格和换行,不过每个缩进都变成了4个空格。
在序列化对象时,所有的函数和原型对象都会被忽略掉,并且,值为undefined的所有属性都会被过滤掉,结果中最终都是值为有效JSON数据类型的实例属性。

JSON.parse()

用JSON.stringify()序列化为JSON字符串的数据都可以使用JSON.parse()序列化成原来的对象格式。而且,序列化后的对象跟原来的对象时完全独立的、没有关系的两个对象。传入的字符串如果不是有效的JSON字符串,该方法会抛出错误。