欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > javascript >内容正文

javascript

【JavaScript】在JavaScript中使用JSON进行序列化/反序列化操作

发布时间:2025/3/15 javascript 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【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()还可以接受其他参数,从而让程序序列化操作变得更加强大。
具体语法规则:

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

参数列表:

  • 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()的输出结果:

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()方法,开发者就必须自行承担对整个对象结构的序列化操作,而这完全违背了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进行序列化/反序列化操作的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。