1.电脑系统 windows10专业版
2.JSON对象有两个办法:stringify()和parse()在简略的状况下,这两个办法别离能够将JavaScript 序列化为 JSON 字符串,以及将 JSON 解析为原生 JavaScript 值。上面我来分享一下应用办法。
3.根本应用:

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.留神:

在序列化 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. 字符串缩进

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()办法

有时候,对象须要在 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.总结

JSON 是一种轻量级数据格式,能够不便地示意简单数据结构。这个格局应用 JavaScript 语法的一个子集示意对象、数组、字符串、数值、布尔值和 null。尽管 XML 也能胜任同样的角色,但 JSON 更简洁,JavaScript 反对也更好。更重要的是,所有浏览器都曾经原生反对全局 JSON 对象。ECMAScript 5 定义了原生 JSON 对象,用于将 JavaScript 对象序列化为 JSON 字符串,以及将 JSON数组解析为 JavaScript 对象。JSON.stringify()和 JSON.parse()办法别离用于实现这两种操作。这两个办法都有一些选项能够用来扭转默认的行为,以实现过滤或批改流程。