关于javascript:javascript中JSON序列化

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()办法别离用于实现这两种操作。
这两个办法都有一些选项能够用来扭转默认的行为,以实现过滤或批改流程。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理