从前有匹马叫代码
心若没有栖息的地方,到哪里都是流浪

JSON(JavaScript Object Notation)是表示值和对象的通用格式。

  

JavaScript 提供了如下方法:

  • JSON.stringify 将对象转换为 JSON。
  • JSON.parse 将 JSON 转换回对象。

stringify 方法提供了三个参数,分别是object,replacer,space

  1. object就是需要转换的对象
  2. replacer 表示是需要转换哪些属性的数组或者一个映射函数
  3. space 则表示输出的字符串的美观性,可以设置成空格数量

需要注意的是,object不能有循环引用,俗称“环形”结构;

代码如下:

let room = {
    number: 2,
};
let meetup = {
    title: "Conference",
    participants: ["john", "joe"],
};

meetup.place = room;
room.occupiedBy = meetup;

// stringify 属性的第二个参数replacer,接收属性数组或者映射函数;
console.log(JSON.stringify(meetup, ["title", "participants"])); //{"title":"Conference","participants":["john","joe"]}

// 接下来这样呢?
meetup.participants = [{ name: "Alice" }, { name: "John" }];

console.log(JSON.stringify(meetup, ["title", "participants"])); //{"title":"Conference","participants":[{},{}]}

// 这里可以看到,replacer执行的过滤很严格,所以我们需要在属性数组中追加属性

console.log(JSON.stringify(meetup, ["title", "participants", "name"])); //{"title":"Conference","participants":[{"name":"Alice"},{"name":"John"}]}

// 虽然可行,但是属性列表太长了并不优雅;接下来:

var result = JSON.stringify(meetup, function replacer(key, value) {
    // 让我们把循环引用的键返回undefined
    // console.log(key);
    return key == "occupiedBy" ? undefined : value;
});

console.log(result);//{"title":"Conference","participants":[{"name":"Alice"},{"name":"John"}],"place":{"number":2}}

// replacer会被递归的调用,直到所有可枚举的属性执行完毕


// 最后一步,第三个参数space表示空格的数量, 更美观

var beauty = JSON.stringify(meetup, function replacer(key, value) {
    return key == "occupiedBy" ? undefined : value;
},2);


console.log(beauty); //如你所见
`
{
    "title": "Conference",
    "participants": [
      {
        "name": "Alice"
      },
      {
        "name": "John"
      }
    ],
    "place": {
      "number": 2
    }
  }
`

parse方法则是解析JSON字符串为Object;parse方法提供了两个参数string,reviver 跟stringify的用法几乎一致;对每个可选的键值对进行调用;

代码如下:

let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';

let meetup = JSON.parse(str, function(key, value) {
  if (key == 'date') return new Date(value);
  return value;
});

alert( meetup.date.getDate() ); // 现在正常运行了!

当然,嵌套对象也是可以的,因为这一个过程是递归进行的,如何验证?只需要在reviver函数中打印一句话就显而易见了

toJSON方法允许我们自定义JSON转换;如果可用,JSON.stringify 会自动调用它

代码如下:

let room = {
  number: 23,
  toJSON() {
    return this.number;
  }
};

let meetup = {
  title: "Conference",
  room
};

alert( JSON.stringify(room) ); // 23

alert( JSON.stringify(meetup) );
/*
  {
    "title":"Conference",
    "room": 23
  }
*/

toJSON 方法即可用于自身,也可用于嵌套情况下;

推荐阅读:《现代JavaScript教程》- JSON方法,toJSON

2021-02-05 

 

posted on 2021-02-05 11:25  从前有匹马叫代码  阅读(109)  评论(0编辑  收藏  举报