《JavaScript高级程序设计》读书笔记
JSON 语法支持表示 3 种类型的值。
- {
- "title": "Professional JavaScript",
- "school": {
- "name": "Merrimack College",
- "location": "North Andover, MA"
- },
- "authors": [
- "Nicholas C. Zakas",
- "Matt Frisbie"
- ]
- }
JSON.stringify()方法除了要序列化的对象,还可以接收两个参数。一个是过滤器,可以是数组或函数;另一个是用于缩进结果JSON字符串的选项。
1. 过滤结果
如果是数组:返回包含该数组中列出的对象属性。
- let book = {
- title: "Professional JavaScript",
- authors: [
- "Nicholas C. Zakas",
- "Matt Frisbie"
- ],
- edition: 4,
- year: 2017
- };
- JSON.stringify(book, ["title", "edition"]);
- // '{"title":"Professional JavaScript","edition":4}'
如果是函数:提供的函数接收两个参数:属性名( key)和属性值( value)。可以根据这个 key 决定要对相应属性执行什么操作。
- JSON.stringify(book, (key, value) => {
- switch(key) {
- case "authors":
- return value.join(",")
- case "year":
- return 5000;
- case "edition":
- return undefined;
- default:
- return value;
- }
- });
- // '{"title":"Professional JavaScript","authors":"Nicholas C. Zakas,Matt Frisbie","year":5000}'
2. 字符串缩进
第三个参数控制缩进和空格。
如果是数值时,表示每一级缩进的空格数。
JSON.stringify(book, null, 4);
如果是字符串,那么就不是用空格来缩进而是用该字符串。最多10个字符,超出截断。
- JSON.stringify(book, null, "--" );
- // '{\n--"title": "Professional JavaScript",\n--"authors": [\n----"Nicholas C. Zakas",\n----"Matt Frisbie"\n--],\n--"edition": 4,\n--"year": 2017\n}'
3. toJSON() 方法
自定义JSON 序列化。这个对象会被序列化为简单字符串而非对象。
- let book = {
- title: "Professional JavaScript",
- authors: [
- "Nicholas C. Zakas",
- "Matt Frisbie"
- ],
- edition: 4,
- year: 2017,
- toJSON: function() {
- return this.title;
- }
- };
- JSON.stringify(book);
- // '"Professional JavaScript"'
执行JSON.stringify() 如下步骤:
JSON.parse()方法也可以接收一个额外的参数,这个函数会针对每个键/值对都调用一次。也接收两个参数,属性名( key)和属性值( value),另外也需要返回值。如果还原函数返回 undefined,则结果中就会删除相应的键。
- let book = {
- title: "Professional JavaScript",
- authors: [
- "Nicholas C. Zakas",
- "Matt Frisbie"
- ],
- edition: 4,
- year: 2017,
- releaseDate: new Date(2017, 11, 1)
- };
- let jsonText = JSON.stringify(book);
- JSON.parse(jsonText,(key, value) => key == "releaseDate" ? new Date(value) : value);