乐趣区

解密JSONstringify的参数使用

基本使用

一般情况下,我们使用 JSON.stringify 序列化对象,即将一个对象的属性和值转化为字符串

let obj = {name:“ken”};
JSON.stringify(obj); //{'name':'ken'}

第二个参数

实际上并不是所有的 JSON 数据都能被序列化

const secondItem = { 
  title: 'Transformers', 
  year: 2007, 
  starring: new Map([[0, 'Shia LaBeouf'],[1, 'Megan Fox']]) 
};

JSON.stringify(secondItem);
// {'title':'Transformers','year':2007,'starring':{}}

可以通过传递第二个参数来解决,首先来看下第二个参数的作用

JSON.stringify(secondItem, ['title']);
// {'title':'Transformers'}

将一个数组传递到第二个参数中,以数组中的元素作为键值返回一个新的 JSON 对象

我们也可以传递一个函数到第二个参数中

JSON.stringify(secondItem, (key, value) => {if (value instanceof Set) {return [...value.values()];
  }
  return value;
});
// {'title':'Transformers','year':2007,'starring':['Shia LaBeouf','Megan Fox']}

传入的这个函数,接收两个值,即 JSON 对象中对应的键值对。通过这个方式可以解决上述的部分数据不能被序列化的问题

第三个参数

JSON.stringify 的第三个参数,用于控制序列比字符的间距(参数类型为数字,缩进的字符宽度)

JSON.stringify(secondItem, null, 2);
//{
//  "title": "Transformers",
//  "year": 2007,
//  "starring": {}
//}

如果传递的是一个字符串,就会用字符串的内容替换掉空白的字符

JSON.stringify(secondItem, null, '????');
//{
//????"title": "Transformers",
//????"year": 2007,
//????"starring": {}
//}

toJSON 方法

自定义 stringify 返回的内容

const thirdItem = { 
  title: 'Transformers', 
  year: 2007, 
  starring: new Map([[0, 'Shia LaBeouf'],[1, 'Megan Fox']]),
  toJSON() {
    return {name: `${this.title} (${this.year})`, 
      actors: [...this.starring.values()] 
    };
  }
};

console.log(JSON.stringify(thirdItem));
// {"name":"Transformers (2007)","actors":["Shia LaBeouf","Megan Fox"]}
退出移动版