javascript序列化-[JavaScript] 在 JavaScript 中使用 JSON 进行序列化/反序列化

2023-08-26 0 5,332 百度已收录

文章目录

用于 stringfy/parse 操作的“JSON”对象

JavaScript 有“JSON”对象,它提供了以下方式:

该对象还具有以下特点:

JavaScript中简单数据类型的JSON序列操作

我们看一下JavaScript中以下基本数据的序列化操作:

以下代码展示了如何使用 JSON.stringfy() 序列化简单数据类型:

javascript序列化-[JavaScript] 在 JavaScript 中使用 JSON 进行序列化/反序列化

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()还可以接受其他参数,这使得程序的序列化操作变得更大。

具体句子规则:

JSON.stringify(value[, replacer[, space]])

参数列表:

以下示例显示了 Replacer 和 space 参数的使用。 本示例优化了发言者对象的显示,同时演示了对数据元素的过滤操作:

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 序列化应该最适合对象。

您可以通过将 toJSON() 添加到扬声器对象来定义 JSON.stringify() 的输出:

let speaker = {firstName: 'LeBron',lastName: 'James',email: 'lbj@gmail.com',about: '...',company: 'USA',tags: ['json', 'rest', 'api', 'oauth'],registered: true
};speaker.toJSON = function() {return 'Hi there!';
};// 序列化
console.log('speaker.toJSON(): ' + JSON.stringify(speaker, null, 2));

如果一个对象有 toJSON 方法,JSON.stringify() 不再尝试将其转换为字符串,而是直接输出该对象的 toJSON() 方法返回的值。 使用 toJSON() 是合法的,但不一定明智。 因为一旦使用toJSON()方法,开发者就必须承担整个对象结构的序列化操作javascript序列化,这完全违背了JSON.stringify()的初衷。 对于像扬声器这样的简单对象来说,可能没有问题,但是对于包含其他对象的复杂对象来说,相关的序列化代码迟早会变得非常复杂。

使用 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);

javascript序列化-[JavaScript] 在 JavaScript 中使用 JSON 进行序列化/反序列化

上面的程序中,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);

上例中的text参数包含newDate()的JavaScript语句,eval()执行成功; JSON.parse() 成功拒绝该参数并报告该参数非法的错误。

如果嵌入的句子富含恶意代码,eval()可能会继续执行,eval()会打开一扇允许任何JavaScript表达式介入的侧门,这将使程序更容易受到攻击。 因此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 对象。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript序列化-[JavaScript] 在 JavaScript 中使用 JSON 进行序列化/反序列化 https://www.wkzy.net/game/159085.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务