JSON.stringify()的一些问题

137 阅读2分钟

定义:JSON是一种轻量据格式,可以方便地表示复杂数据结构。JSON对象有两个方法:stringify()和parse()。在简单的情况下,这两个方法分别可以将JavaScript序列化为JSON字符串,以及将JSON解析为原生JavaScript值。

  1. 用console.log()打印对象到字符串的默认转换是 [object Object]。而使用JSON.stringify() 则可以显示:
const user = {
 "name" : "Prateek Singh",
 "age" : 26
}
console.log(JSON.stringify(user));
// 结果
// "{ "name" : "Prateek Singh", "age" : 26 }"
  1. stringify()有第二个参数,可作为过滤器:
let json1 = { 
    title: "Json.stringify", 
    author: [ "浪里行舟" ], 
    year: 2021, 
    like: 'frontend', 
    weixin: 'frontJS' 
}; 
let jsonText = JSON.stringify(json1, ['weixin']);

打印: "{"weixin":"frontJS"}"

  1. 第三个参数,数字-》表示缩进,若第三个参数是字符串,则表示替换空格字符
1let jsonText = JSON.stringify(json1, null, 4);
2JSON.stringify(user, null,'**');
//{
//**"name": "Prateek Singh",
//**"age": 26,
//**"country": "India"
//}
// 这里 * 取代了空格字符
  1. toJSON方法

可以作为任意对象的属性。JSON.stringify 返回这个函数的结果并对其进行序列化,而不是将整个对象转换为字符串。例:

const user = {
 firstName : "Prateek",
 lastName : "Singh",
 age : 26,
 toJSON() {
    return { 
      fullName: `${this.firstName} + ${this.lastName}`
    };
 }
}

console.log(JSON.stringify(user));

// 结果
// "{ "fullName" : "Prateek Singh"}"
-----------------------------------
JSON.stringify() 的 5 个秘密特性
https://blog.51cto.com/u_15497323/5250895
  1. 使用场景:
  • 判断数组是否包含某对象,或者对象是否相等(不可靠)
//判断数组是否包含某对象
let data = [ {name:'浪里行舟'}, 
            {name:'前端工匠'}, 
            {name:'前端开发'}, 
           ], 
val = {name:'浪里行舟'}; 
console.log(JSON.stringify(data).indexOf(JSON.stringify(val)) !== -1);//true

对象如果调整了键的顺序,则判断会出错!所以不可靠

  • 存储localStorage:localStorage默认只能存字符串 而实际开发中,我们往往需要存储对象类型,那么此时我们需要在存储时利用json.stringify()将对象转为字符串,在取本地缓存时,使用json.parse()转回对象即可。
// 存数据 
function setLocalStorage(key,val) { 
      window.localStorage.setItem(key, JSON.stringify(val)); }; 

// 取数据 
function getLocalStorage(key) { 
      let val =JSON.parse(window.localStorage.getItem(key));    
      return val; 
};
  • 实现对象深拷贝,但不能处理函数和正则 但有两个问题:1.函数序列化后变为null 2.正则序列化后为空对象
let arr1 = [1, 3, function () { }, {username: ' kobe'},/^[a-b]+/g];
let arr2 = JSON.parse(JSON.stringify(arr1));

arr2[3].username = 'duncan';
console.log(arr1, arr2)

打印结果:

[ 1, 3, [Function (anonymous)], { username: ' kobe' }, /^[a-b]+/g ] 
[ 1, 3, null, { username: 'duncan' }, {} ]
  • NaN和Infinity转换,则变为null JSON.stringify([NaN, Infinity]) // [null,null]

  • 数组中的undefined、任意的函数以及symbol值在序列化的过程中会被转换成 null JSON.stringify([undefined, function () { }, Symbol("")]); // '[null,null,null]'

  • 非数组中的undefined、任意的函数以及symbol值在序列化的过程中会被忽略 JSON.stringify({ x: undefined, y: function () { }, z: Symbol("") }); // '{}'