优秀的编程知识分享平台

网站首页 > 技术文章 正文

js中的JSON.stringify()方法的用法

nanyue 2024-08-01 22:42:42 技术文章 5 ℃

关注我,知码前端 获取更多知识~~,公众号: 知码前端

前言

上节说了json的一些基本知识,现在说一下在js中处理json的两个重要方法JSON.stringify()和JSON.parse()方法。上节也简单说了下这两个方法的基本用法,现在开始说一下这两个方法比较高级的地方,在一些情况下,还是挺有用的。

如果对json还不熟悉的小伙伴,建议先去阅读一下前面的文章。

你真会用js中的JSON(一)?

JSON.stringify()

先来看一下这个方法的签名:

JSON.stringify(value[, replacer[, space]])

从上面可以看出这个方法可以接收三个参数:

  • value:是必需的参数,是要转换的成json的值,通常是对象或者是数组
  • replacer:是一个可选的参数,类型可以是函数或者数组
  • space:是一个可选的参数,表示可以在json字符串前面添加的空格,最多可以添加10个空格,类型可以是数值或者字符串。其目的是为了增加json字符串的可读性。
// 只有一个参数的时候:
var person = {
  name: '张三',
  age: 10,
  city: '北京'
}
JSON.stringify(person) // {"name":"张三","age":10,"city":"北京"}

// 假如一个对象的属性值是undefined的时候会是怎么样?
var person2 = {
  name: '张三',
  age: 10,
  city: undefined,
  getName: function () {
    console.log(this.name)
  }
}
JSON.stringify(person2) // {"name":"张三","age":10}
// 可以发现,如果某个对象的属性值是undefined或者是函数的时候,会把这个属性忽略。
// 在平时书写的时候一定要注意这个地方

// 假如我们在数组里面放入undefined或者是函数的时候又是怎么样的?
var array = [1, false, undefined, function () {}]
JSON.stringify(array) // [1,false,null,null]
// 咦??竟然没有被过滤,而是把它们都转成了null

总结:

  • 当对象的属性是undefined或者是函数的时候,JSON.stringify()方法会把它们过滤
  • 当数组中的某个成员是undefined或者是函数的时候,JSON.stringify()不会过滤它们,而把它们转成null
// 接收两个参数的时候
// 当参数类型是数组的时候:
var person = {
  name: '张三',
  age: 10,
  city: '北京',
  job: 'it'
}
var props = ['name', 'age']
JSON.stringify(person, props) // {"name":"张三","age":10}
// 可以发现json串中只有数组传入的两个属性。
// 这说明当第二个参数是数组的时候,只会把该对象在数组中有的成员的属性转成json

// 再来看一下对数组对象是不是也这样?
var array = ['name', 'age', 'city']
var props1 = ['0', '1']
JSON.stringify(array, props1) // ["name","age","city"]
// 可以发现数组的所有成员都被转在了json
// 这说明对于数组对象,是无效的,只有对 对象有效
// 当参数是函数的时候
// 看一个业务场景:
// 我有一个对象,想把某个属性值过滤,但这个属性值不是undefined或者函数类型的,该怎么办?
var person = {
  name: '张三',
  age: 10,
  city: '北京'
}
// 现在不想把city也转成json
// key 是对象属性的键
// value 是对象属性的值
function toJson(key, value) {
  if (key === 'city') {
    return undefined
  }
  return value
}
JSON.stringify(person, toJson) // {"name":"张三","age":10}
// 可以看出如果在平时应用中,如果我们不想把某个值转成json,则可以利用这个特性处理

// 小伙伴可以试一下如果在数组中,会不会利用函数把它给过滤呢?

总结:

  • 当参数是数组的时候,对于对象来说会根据数组里面的成员来生成json。对于数组对象来说,则没有效果
  • 当参数是函数的时候,会把每个键值作为参数传入到回调函数中,可以利用一些特性来过滤一些我们不需要的属性
// 当接收三个参数的时候
// 有时候我们为了增加json字符串的可读性,会增加一些格式,当然也可利用一些网站格式化json
var person = {
  name: '张三',
  age: 10,
  city: '北京',
}
var space = 2
JSON.stringify(person, null, space)
/*
{
  "name": "张三",
  "age": 10,
  "city": "北京"
}
*/
// 可以看出每个键值都缩进了2个空格


// 把 space 值改成 10
/*
{
          "name": "张三",
          "age": 10,
          "city": "北京"
}
*/

// 把 space 值改成 20
/*
{
          "name": "张三",
          "age": 10,
          "city": "北京"
}
*/
// 可以看出最大就是10个空格

// 把 space 值改成 字符串 '++++'
/*
{
++++"name": "张三",
++++"age": 10,
++++"city": "北京"
}
*/

总结:

JSON.stringify()的第三个参数主要是为了增加可读性,如果是数值,就代表在键值前面增加多少个空格, 最多10个。如果是字符串,就代表在键值前面增加这个字符串,其实这个字符串的长度最大也是10个字符,可以试一下哦~~

下篇继续介绍JSON.parse()的高级方法,和一个不常用的知识点。比JSON.stringify()方法要简单很多~~

关注我,知码前端 获取更多知识~~

最近发表
标签列表