javascript
【JavaScript】在JavaScript中使用JSON进行序列化/反序列化操作
文章目录
- 用于stringfy/parse操作的"JSON"对象
- JavaScript中简单数据类型的JSON序列化操作
- 使用toJSON()进行对象的序列化操作
- 使用eval()进行JSON的反序列化操作
- 使用JSON.parse()进行JSON的反序列化操作
用于stringfy/parse操作的"JSON"对象
JavaScript中有“JSON”对象,该对象提供以下方法:
- JSON.stringfy():将信息序列化为JSON
- JSON.parse() :将JSON反序列化为JavaScript可理解的数据结构
该对象还具有以下特征:
- 最初由 Douglas Crockford 所开发
- 无法实例化
- 除了stringfy()和parse()以外不提供其他功能
JavaScript中简单数据类型的JSON序列化操作
来看看JavaScript中下列基础数据的序列化操作:
- 数值
- 字符串
- 数组
- 布尔值
- 字面量对象
下面的代码展示了如何使用JSON.stringfy()来序列化简单数据类型:
let age = 39; // 整数 console.log('age = ' + JSON.stringify(age) + '\n');let fullName = 'LeBron James'; // 字符串 console.log('fullName = ' + JSON.stringify(fullName) + '\n');let tags = ['json', 'rest', 'api', 'oauth']; // 数组 console.log('tags = ' + JSON.stringify(tags) + '\n');let reqistered = true; // 布尔 console.log('registered = ' + JSON.stringify(reqistered) + '\n');let speaker = {firstName: 'LeBron',lastName: 'James',email: 'lbj@gmail.com',about: '...',company: 'USA',tags: ['json', 'rest', 'api', 'oauth'],registered: true };console.log('speaker = ' + JSON.stringify(speaker));上面的代码可以在安装Node.js后用node命令在命令行运行。
对于标量类型(数值、字符串、布尔值),JSON.stringify()并没有提供什么有趣的功能。
但是对于speaker这种对象字面量来说,JSON.stringify()会生成一段驳杂却合法的JSON字符串,因此显得比较有用。
JSON.stringify()还可以接受其他参数,从而让程序序列化操作变得更加强大。
具体语法规则:
参数列表:
- value(必选)
需要进行序列化的JavaScript值。 - replacer(可选)
函数 或者数组。如果是函数,stringify()会为value对象中的每个名称-值对调用replacer。 - space(可选)
数值或者字符串,表示缩进。如果是数值,则表示每一级缩进所占的空格数。
下面的例子展示了replacer和space参数的使用,该实例优化了speaker对象的显示,同时也展示了对数据元素的过滤操作:
let speaker = {firstName: 'LeBron',lastName: 'James',email: 'lbj@gmail.com',about: '...',company: 'USA',tags: ['json', 'rest', 'api', 'oauth'],registered: true };function serializeSpeaker(key, value) {return (typeof value === 'string' || Array.isArray(value)) ? undefined : value; }console.log('Speaker (pretty print):\n' + JSON.stringify(speaker, null, 2) + '\n');// 打印并过滤掉字符串和数组 console.log('Speaker without Strings and Arrays:\n' +JSON.stringify(speaker, serializeSpeaker, 2));使用toJSON()进行对象的序列化操作
JSON序列化操作最应该适用于对象。
可以通过向speaker对象中添加toJSON()方法来定义JSON.stringify()的输出结果:
如果一个对象有toJSON方法,则JSON.stringify()不再试图将其转换为字符串,而是直接输出该对象的toJSON()方法所返回的值。使用toJSON()方法是合法的,但不一定明智。因为一旦使用了toJSON()方法,开发者就必须自行承担对整个对象结构的序列化操作,而这完全违背了JSON.stringify()的初衷。对于speaker这样的简单对象来说,可能没有什么问题,但对于包含其他对象的复杂对象来说,相关序列化代码迟早会变得十分复杂。
使用eval()进行JSON的反序列化操作
不推荐!
JavaScript开发者最早是采用eval()函数来解析JSON的。
eval()可以接收一个字符串作为参数。这个字符串可以是一个JavaScript表达式,一句JavaScript语句,或者一连串JavaScript语句。
let x = '{ "sessionDate": "2020-10-06T13:30:00.000Z" }';console.log('Parse with eval(): ' + eval('(' + x + ')').sessionDate + '\n');console.log('Parse with JSON.parse(): ' + JSON.parse(x).sessionDate);上述程序中eval()和JSON.parse()执行结果相同,都解析了日期属性。请接着看:
let x = '{ "sessionDate": new Date() }';console.log('Parse with eval(): ' + eval('(' + x + ')').sessionDate + '\n');console.log('Parse with JSON.parse(): ' + JSON.parse(x).sessionDate);上述示例的文本参数含有new Date()这一条JavaScript语句,而eval()成功执行了;JSON.parse()则成功拒绝了这一参数并报错参数非法。
如果嵌入语句中含有恶意代码,eval()可能也会继续执行,eval()会打开允许任何JavaScript表达式进入的后门,这会使得程序更易受到攻击。因此尽管eval()可以用于解析JSON,但一般不安全,也不合适。
JavaScript对JSON的解析废弃了eval()函数,取而代之的是下面的JSON.parse()。
使用JSON.parse()进行JSON的反序列化操作
// 多行JSON字符串 let json = '{' +'"firstName": "LeBron",' +'"lastName": "James",' +'"email": "lbj@gmail.com",' +'"about": "...",' +'"company": "USA",' +'"tags": [' +'"json",' +'"rest",' +'"api",' +'"oauth"' +'],' +'"registered": true' + '}';// 反序列化 let speaker = JSON.parse(json);console.log('speaker.firstName = ' + speaker.firstName);JSON.parse()接受一个JSON字符串作为输入,并将其解析为完整的JavaScript对象。
总结
以上是生活随笔为你收集整理的【JavaScript】在JavaScript中使用JSON进行序列化/反序列化操作的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【数据结构与算法】基础数据结构与算法大全
- 下一篇: 详解Spring框架的依赖注入