1.电脑系统 windows10专业版
2.JSON对象有两个方法:stringify()和parse()在简单的状况下,这两个方法分别能够将JavaScript 序列化为 JSON 字符串,以及将 JSON 解析为原生 JavaScript 值。下面我来分享一下使用方法。
3.基本使用:json
let book = { title: "Professional JavaScript", authors: [ "Nicholas C. Zakas", "Matt Frisbie" ], edition: 4, year: 2017 }; let jsonText = JSON.stringify(book);
这个例子使用 JSON.stringify()把一个 JavaScript 对象序列化为一个 JSON 字符串,保存在变量 jsonText 中。默认状况下,JSON.stringify()会输出不包含 空格或缩进的 JSON 字符串,所以jsonText 的值是这样的:
{"title":"Professional JavaScript","authors":["Nicholas C. Zakas","Matt Frisbie"], "edition":4,"year":2017}
4.注意:windows
在序列化 JavaScript 对象时,全部函数和原型成员都会有 意地在结果中省略。 此外,值为 undefined 的任何属性也会被跳过。 最终获得的就是全部实例属性均为有效 JSON 数据类型的表示。
5.JSON 字符串能够直接传给 JSON.parse(),而后获得相应的 JavaScript 值,好比,可使用如下代码建立与 book 对象相似的新对象:数组
let bookCopy = JSON.parse(jsonText);
注意,book 和 bookCopy 是两个彻底不一样的对象,没有任何关系。可是它们拥有相同的属性和值。 若是给 JSON.parse()传入的 JSON 字符串无效,则会致使抛出错误。
6.序列化选项浏览器
实际上,JSON.stringify()方法除了要序列化的对象,还能够接收两个参数。 这两个参数能够用于指定其余序列化 JavaScript 对象的方式。 第一个参数是过滤器,能够是数组或函数; 第二个参数是用于缩进结果 JSON 字符串的选项。 单独或组合使用这些参数能够更好地控制 JSON 序列化。
7.1. 过滤结果:数组
若是第二个参数是一个数组,那么 JSON.stringify()返回的结果只会包含该数组中列出的对象
属性。好比下面的例子:数据结构
let book = { title: "Professional JavaScript", authors: [ "Nicholas C. Zakas", "Matt Frisbie" ], edition: 4, year: 2017 }; let jsonText = JSON.stringify(book, ["title", "edition"]);
在这个例子中,JSON.stringify()方法的第二个参数是一个包含两个字符串的数组:"title"和"edition"。它们对应着要序列化的对象中的属性,所以结果 JSON 字符串中只会包含这两个属性:
{"title":"Professional JavaScript","edition":4}
7.2. 过滤结果:函数函数
若是第二个参数是一个函数,则行为又有不一样。 提供的函数接收两个参数:属性名(key)和属性值(value)。 能够根据这个 key 决定要对相应属性执行什么操做。 这个 key 始终是字符串,只是在值 不属于某个键/值对时会是空字符串。
为了改变对象的序列化,返回的值就是相应 key 应该包含的结果。 注意,返回 undefined 会致使 属性被忽略。下面看一个例子:
let book = { title: "Professional JavaScript", authors: [ "Nicholas C. Zakas", "Matt Frisbie" ], edition: 4, year: 2017 }; let jsonText = JSON.stringify(book, (key, value) => { switch(key) { case "authors": return value.join(",") case "year": return 5000; case "edition": return undefined; default: return value; } });
这个函数基于键进行了过滤。若是键是"authors",则将数组值转换为字符串; 若是键是"year",则将值设置为 5000; 若是键是"edition",则返回 undefined 忽略该属性。 最后必定要提供默认返回值,以便返回其余属性传入的值。 第一次调用这个函数实际上会传入空字符串 key,值是 book 对象。 最终获得的 JSON 字符串是这样的:
{"title":"Professional JavaScript","authors":"Nicholas C. Zakas,Matt Frisbie","year":5000}
注意,函数过滤器会应用到要序列化的对象所包含的全部对象, 所以若是数组中包含多个具备这些 属性的对象,则序列化以后每一个对象都只会剩下上面这些属性。
7.3. 字符串缩进this
JSON.stringify()方法的第三个参数控制缩进和空格。在这个参数是数值时,表示每一级缩进的 空格数。例如,每级缩进 4 个空格,能够这样
let book = { title: "Professional JavaScript", authors: [ "Nicholas C. Zakas", "Matt Frisbie" ], edition: 4, year: 2017 }; let jsonText = JSON.stringify(book, null, 4);
// 这样获得的 jsonText 格式以下: { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas", "Matt Frisbie" ], "edition": 4, "year": 2017 }
注意,除了缩进,JSON.stringify()方法还为方便阅读插入了换行符。这个行为对于全部有效的缩进参数都会发生。(只缩进不换行也没什么用。)最大缩进值为 10,大于 10 的值会自动设置为 10。
若是缩进参数是一个字符串而非数值,那么 JSON 字符串中就会使用这个字符串而不是空格来缩进。使用字符串,也能够将缩进字符设置为 Tab 或任意字符,如两个连字符:
let jsonText = JSON.stringify(book, null, "--" );
这样,jsonText 的值会变成以下格式: { --"title": "Professional JavaScript", --"authors": [ ----"Nicholas C. Zakas", ----"Matt Frisbie" --], --"edition": 4, --"year": 2017 }
注意:使用字符串时一样有 10 个字符的长度限制。若是字符串长度超过 10,则会在第 10 个字符处截断。
7.4. toJSON()方法code
有时候,对象须要在 JSON.stringify()之上自定义 JSON 序列化。此时,能够在要序列化的对象 中添加 toJSON()方法,序列化时会基于这个方法返回适当的 JSON 表示。事实上,原生 Date 对象就 有一个 toJSON()方法,可以自动将 JavaScript 的 Date 对象转换为 ISO 8601 日期字符串(本质上与在 Date 对象上调用 toISOString()方法同样)。
下面的对象为自定义序列化而添加了一个 toJSON()方法: let book = { title: "Professional JavaScript", authors: [ "Nicholas C. Zakas", "Matt Frisbie" ], edition: 4, year: 2017, toJSON: function() { return this.title; } }; let jsonText = JSON.stringify(book);
这里 book 对象中定义的 toJSON()方法简单地返回了图书的书名 (this.title) 与 Date 对象相似,这个对象会被序列化为简单字符串而非对象。 toJSON()方法能够返回任意序列化值,均可以起到相应的做用。 若是对象被嵌入在另外一个对象中,返回 undefined 会致使值变成 null; 或者若是是顶级对象,则自己就是 undefined。 注意,箭头函数不能用来定义 toJSON()方法。 主要缘由是箭头函数 的词法做用域是全局做用域,在这种状况下不合适。
toJSON()方法能够与过滤函数一块儿使用,所以理解不一样序列化流程的顺 序很是重要。 在把对象传给 JSON.stringify()时会执行以下步骤。 (1) 若是能够获取实际的值,则调用 toJSON()方法获取实际的值, 不然使用默认的序列化。 (2) 若是提供了第二个参数,则应用过滤。 传入过滤函数的值就是第(1)步返回的值。 (3) 第(2)步返回的每一个值都会相应地进行序列化。 (4) 若是提供了第三个参数,则相应地进行缩进。 理解这个顺序有助于决定是建立 toJSON()方法, 仍是使用过滤函数,抑或是二者都用。
8.解析选项对象
JSON.parse()方法也能够接收一个额外的参数,这个函数会针对每一个键/值对都调用一次。为区别 于传给 JSON.stringify()的起过滤做用的替代函数(replacer),这个函数被称为还原函数(reviver)。 实际上它们的格式彻底同样,即还原函数也接收两个参数,属性名(key)和属性值(value),另外也 须要返回值。
若是还原函数返回 undefined,则结果中就会删除相应的键。若是返回了其余任何值,则该值就 会成为相应键的值插入到结果中。还原函数常常被用于把日期字符串转换为 Date 对象。例如:
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); let bookCopy = JSON.parse(jsonText, (key, value) => key == "releaseDate" ? new Date(value) : value); alert(bookCopy.releaseDate.getFullYear());
以上代码在 book 对象中增长了 releaseDate 属性,是一个 Date 对象。 这个对象在被序列化为JSON 字符串后,又被从新解析为一个对象 bookCopy。 这里的还原函数会查找"releaseDate"键,如 果找到就会根据它的日期字符串建立新的 Date 对象。 获得的 bookCopy.releaseDate 属性又变回了 Date 对象,所以能够调用其 getFullYear()方法。
9.总结ip
JSON 是一种轻量级数据格式,能够方便地表示复杂数据结构。 这个格式使用 JavaScript 语法的一个 子集表示对象、数组、字符串、数值、布尔值和 null。虽然 XML 也能胜任一样的角色,但 JSON 更简 洁,JavaScript 支持也更好。 更重要的是,全部浏览器都已经原生支持全局 JSON 对象。 ECMAScript 5 定义了原生 JSON 对象,用于将 JavaScript 对象序列化为 JSON 字符串,以及将 JSON 数组解析为 JavaScript 对象。 JSON.stringify()和 JSON.parse()方法分别用于实现这两种操做。 这两个方法都有一些选项能够用来改变默认的行为,以实现过滤或修改流程。