JSON.stringify()不为人所知的功能

JSON.stringify(...)是将JSON对象序列化为字符串,先看一下JSON.stringify的基本使用方式:

var car = {
  name: '小喵',
  age: 20,
  gender: undefined,
  say: function(){},
  other: Symbol('hello')
}

var str = JSON.stringify(car);

console.log(str) 
//=> {"name":"小喵","age":20}

console.log(JSON.stringify([1, undefined, function(){}, 4, Symbol('world')]))
//=> [1,null,null,4,null]

JSON.stringify()在对象中遇到undefinedfunctionsymbol时会自动将其忽略,在数组中则会返回null(以保证单元位置不变)。

我们再来看一个JSON.stringify()的使用:

var a = {}

var b = {
  a: a
}
a.b = b

console.log(JSON.stringify(a))
//=> TypeError: Converting circular structure to JSON

在上面的例子中,我们看到了对循环引用的对象进行JSON.stringify会出错。

如上所示,我们对非法的JSON值的对象进行字符串化就会出错,那如果还是希望得到一个安全的JSON值要怎么办呢?

答案是:给a对象定义的一个toJSON()方法,JSON字符串化时会首先调用toJSON()方法,然后用它的返回来进行序列化。

var a = {}

var b = {
  a: a
}
a.b = b

a.toJSON = function() {
  return {'自定义': '返回安全的JSON值'}
}

console.log(JSON.stringify(a))
//=> {"自定义":"返回安全的JSON值"}

⚠️注意:应该让toJSON方法返回一个JSON值,因为字符串化是根据toJSON()返回值进行序列化


下面进入主题,说说JSON.stringify()一些不为人所知的功能:JSON.stringify()还接收两个可选择的参数replacerspace,先来看一个replacer

可选参数:replacer (可以是数组或者函数)

下面用一个例子,看看接收数组或者函数的效果:

var a = {
  b: 42,
  c: '42',
  d: [1,2,3]
}

var result_1 = JSON.stringify(a, ['b', 'c'])

var result_2 = JSON.stringify(a, (k, v) => {
  if (k !== 'c' && k !== 'b') return v;
})

console.log(result_1, result_2)
//=>{"b":42,"c":"42"} {"d":[1,2,3]}
  1. 如果replacer是一个数组,那么它必须是一个字符串,其中包含序列化要处理的对象的属性名称,除此之外其他的属性则被忽略
    2)如果replacer是一个函数,它会对对象本身调用一次,然后对对象中的每个属性各调用一次,每次传递两个参数,键和值。如果要忽略某个键就返回undefined,否则返回指定的值。

可选参数:space

这个参数是用来指定输出的缩进格式,如果space为整数时是每一级缩进的字符数,如果是字符就用该字符替代每一级缩进的空格数,还是看看例子比较直观:

var car = {
  name: 'hi',
  test: {
    name: 'hello'
  }
}

var str_1 = JSON.stringify(car, null, 3);
var str_2 = JSON.stringify(car, null, '--');
console.log(str_1)
{
  "name": "hi",
  "test": {
    "name": "hello"
  }
}
console.log(str_2)
{
--"name": "hi",
--"test": {
----"name": "hello"
--}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 引言 曾经有一段时间,XML是互联网上传输结构化数据的事实标准。Web服务的第一次浪潮很大程度上都是建立在XML之...
    DHFE阅读 643评论 0 0
  • 我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题,请问,以下JS对象通过JSON.stringify...
    程序员之路阅读 1,003评论 0 6
  •   曾经有一段时间,XML 是互联网上传输数据化结构的事实标准。Web 服务的第一次浪潮很大程度上都是建立在 XM...
    霜天晓阅读 368评论 0 1
  • 独行的旅途中,与陌生人一秒的眼神交接,一分钟的短暂谈话,一小时途中搭伴,可能都会成为自己成长中的难忘回忆。在自己的...
    懿冉臻阅读 1,007评论 1 6
  • 移动互联网的红利期就目前的形式来看,除了自媒体行业与内容营销以外,小程序将会成为一个新的获利点,而且随着微信对于小...
    以撒的以后阅读 405评论 1 0