前端的全栈混合之路Meteor篇(四):支持自定义对象序列化的EJSON介绍

ops/2025/2/11 8:44:15/

简介

Meteor框架中,EJSON(Extended JSON)是一个扩展了标准JSON的库,旨在支持更多的数据类型。标准JSON仅支持字符串、数字、布尔值、数组和对象等基本数据类型,而EJSON允许开发者在Meteor应用中传输更复杂的数据类型,例如DateBinary数据,甚至是自定义对象。

EJSON的核心优势在于其可序列化和反序列化的能力,这使得Meteor在客户端和服务器之间传递复杂数据变得更加便捷和高效。

本文为Meteor全栈框架系列文之一,快速连接:

  • 开发环境的搭建 -全局安装或使用docker镜像
  • 浏览器端的数据库-MiniMongo
  • RPC方法注册及调用

在进行数据同步等时,往往需要向前端传递很多类型的数据,但对象的传输一般依赖于js runtime提供的JSON的stringify方法,但这个方法面对未定义toJSON方法的对象,例如Date时,会转化成一个字符串,反序列化parse时无法还原成Date,就可能存在一定的问题,或者每次都需要特殊处理。而Meteor则默认使用EJSON来序列化和反序列化,rpc返回的数据,调用rpc的参数等,都默认支持更多的类型-(例如二进制数据不需要转化成base64),所以了解下它的几个常用方法和如何自定义传输对象是很有用的–毕竟通过共享数据结构是可以提高开发效率的。

1 EJSON的接口

1.1 序列化EJSON.stringify

与标准的JSON.stringify类似,EJSON.stringify将EJSON对象序列化为字符串,但它能够处理更复杂的类型。
用法:

javascript">const obj = { name: "Meteor", date: new Date() };
const ejsonString = EJSON.stringify(obj);
console.log(ejsonString);

1.2 反序列化EJSON.parse

类似于JSON.parse,它从字符串中解析EJSON对象,支持对复杂类型的正确解析。
用法:

javascript">const ejsonString = '{"name":"Meteor","date":{"$date":1633029593494}}';
const parsedObj = EJSON.parse(ejsonString);
console.log(parsedObj);

1.3 对象克隆EJSON.clone

深度克隆一个EJSON对象,确保原始对象与副本完全独立。
用法:

javascript">const obj = { name: "Meteor", date: new Date() };
const clonedObj = EJSON.clone(obj);

1.4 对象比较EJSON.equals

用于比较两个EJSON对象,支持对日期、二进制数据等复杂数据类型的深度比较。
用法:

javascript">const obj1 = { name: "Meteor", date: new Date() };
const obj2 = EJSON.clone(obj1);
console.log(EJSON.equals(obj1, obj2)); // true

1.5 EJSON.isBinary

检查给定值是否为EJSON的二进制数据。
用法:

javascript">const binary = EJSON.newBinary(10);
console.log(EJSON.isBinary(binary)); // true

1.6 自定义类型注册EJSON.addType

用于定义和注册自定义类型,以便EJSON可以序列化和反序列化这些类型。
用法:

javascript">class CustomType {constructor(value) {this.value = value;}// 将自定义类型转换为普通对象toJSONValue() {return { value: this.value };}// 从普通对象恢复自定义类型static fromJSONValue(obj) {return new CustomType(obj.value);}
}// 注册自定义类型
EJSON.addType('CustomType', CustomType);

2 自定义对象的传输

EJSON提供了内置的扩展机制,使得开发者可以轻松地定义自己的对象类型并在客户端与服务器之间传输。要实现自定义对象的传输,开发者需要遵循以下步骤:

2.1 创建自定义类型

创建一个自定义类,并实现两个核心方法:

  • toJSONValue():将对象的实例转换为普通的JSON结构,便于传输。
  • fromJSONValue():从普通的JSON结构重建对象实例。
javascript">class Point {constructor(x, y) {this.x = x;this.y = y;}// 序列化为JSONtoJSONValue() {return { x: this.x, y: this.y };}// 反序列化为Point对象static fromJSONValue(obj) {return new Point(obj.x, obj.y);}
}

2.2 注册自定义类型

通过EJSON.addType将自定义类型注册到EJSON系统中。注册后的类型将自动支持序列化和反序列化。

javascript">EJSON.addType('Point', Point);

2.3 使用自定义对象传输

一旦自定义类型注册完成,开发者就可以像使用普通EJSON对象一样传输自定义对象。例如,在客户端创建一个Point对象并传输到服务器端。

javascript">// 客户端
const point = new Point(5, 10);
const ejsonString = EJSON.stringify(point);// 服务器端
const receivedPoint = EJSON.parse(ejsonString);
console.log(receivedPoint instanceof Point); // true

通过这种方式,Meteor的EJSON为复杂对象的传输提供了高度的灵活性和可扩展性,允许开发者根据项目需求自由定义自己的数据结构,并确保这些数据在客户端和服务器之间能够无缝传递。

3 结论

EJSON是Meteor框架中一个强大的工具,它扩展了JSON的功能,允许传输更多复杂的数据类型,同时支持自定义对象的序列化与反序列化。通过EJSON,Meteor应用可以轻松处理诸如日期、二进制数据等复杂类型,并提供了灵活的接口来定义和传输自定义对象,极大地增强了数据交互的能力。

读再多不如练练手,赶紧试试像后端之间传输一个自定义的对象吧


http://www.ppmy.cn/ops/124122.html

相关文章

MySQL - 索引

索引(index)是帮助数据库高效获取数据的数据结果。 优点: 提高数据查询的效率,降低数据库的IO成本通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗 缺点: 索引会占用存储空间索引…

【VUE】介绍一下Vue中的虚拟DOM【小面试】

1.定义虚拟DOM:虚拟DOM是一个JavaScript对象,它描述了真实DOM树的结构和属性,但不包含具体的渲染内容。 2.工作原理:当数据发生变化时,Vue会先生成一棵新的虚拟DOM树,然后与旧的虚拟DOM树进行比较&#xf…

GISBox工具:轻松实现倾斜摄影数据从OSGB到3D Tiles的转变

在现代地理信息系统(GIS)和三维可视化领域,倾斜摄影数据(OSGB格式)和3D Tiles格式是两种广泛应用的数据格式。然而,将OSGB数据转换为3D Tiles格式以便在Cesium等平台上加载和展示,一直是许多开发…

redis 5的安装及启动(window)

最近看大模型的时候发现入手redis的同学没有练手的,而且大部分redis的文章要钱才能看,在这里我把路径和环境配置,启动给大家说一下 下载 redis5的获取链接在下面(为什么是redis5,因为上个模型用的就是redis5&#xff…

【开源免费】基于SpringBoot+Vue.JS洗衣店订单管理系统(JAVA毕业设计)

本文项目编号 T 068 ,文末自助获取源码 \color{red}{T068,文末自助获取源码} T068,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 顾…

华为云应用侧Android Studio开发

本文将介绍如何使用AndroidStudio开发APP完成与接入华为云IoTDA设备的对接,包括属性参数获以及取命令下发。 一、鉴权认证 应用侧需要通过IAM服务鉴权,获取token,华为账号创建 IAM 用户, 可以为创建的用户分配权限 认证鉴权_设…

Nginx部署前端Vue项目的深度解析

目录 一、准备工作 1.1 开发环境 1.2 服务器环境 1.3 Nginx安装 二、构建Vue项目 三、上传静态文件到服务器 四、配置Nginx 五、测试并重新加载Nginx 六、访问Vue应用 七、高级配置 7.1 启用HTTPS 7.2 启用Gzip压缩 7.3 缓存控制 八、常见问题与解决方案 8.1 40…

ORA-01005: null password given; logon denied

Springboot项目更换数据库用户后启动服务报错提示:ORA-01005: null password given; logon denied 检查配置文件各项都正常,确认密码已经配置,确认数据库驱动与JDK相匹配后 可以尝试使用如下脚本设置数据库密码大小写不敏感 alter system …