json最大长度限制_自己实现一个类 JSON 数据结构

d2d4bd0a1f570d458fba5c7b615dad7d.png

JSON,仅支持极少的数据类型,或者是为了跨平台和语言的兼容性,又或者是因为其他什么原因。总之,它虽然成为现在网络传输接口中最普遍的数据结构,但由于自身限制,在使用过程中它也给开发者带来了一些负担。诸如类型丢失,某些数据无法被序列化而丢失等等。开发者需要非常小心才能理解到自己需要在将对象序列化成 JSON 之前,下一些功夫,才能保证自己的数据被正确传输了。

例如,ES2015 之后引入的 Map 和 Set 类型,使用已经相当普遍,但虽如此,它们依旧没有实现序列化 JSON 的接口,如果尝试使用 JSON.stringify() 来序列化它们,则只会得到一个空对像。即使开发者有意将其在转换之前自己先把元素拷贝到一个标准对象上以便传输,在数据的接收端,依旧不会自动还原为原来的模样。在这个过程中,开发者面临着数据和类型丢失的双重问题。

BSON,一种继承了 JSON 的数据结构,被运用于 MongoDB 上,它革命性的引入了少量的“复合类型”来弥补 JSON 的不足,如 ObjectId, ISODate 等,但也仅仅是为了数据存储和比较的方便,因此并没有大胆地继续开拓其它类型。

我最近在一些个人的“小项目”中,主要是 IPC/TCP 通信上,大概是利用 NodeJS 的集群(cluster)来广播事件和传递数据,其中有一个是要实现一个基于“内存-文件”的集群存储器,用以在集群进程中同步和共享缓存数据。也就是在这个过程中想到了要开发一个新的数据结构来解决 JSON 玄而未决的问题。

当然这个新的数据结构并不只用来做数据保存,最重要的是它能够最大程度解决数据传输过程中丢失类型和状态的问题,并更多地应用在 IPC/RPC 传输上,来保证数据传输端和接收端的数据一致性。

我曾经做过两年的 PHP 开发,在 PHP 中有一对 serialize/unserialize 函数用来序列化和反序列化数据,并且它们支持自定义的数据类型,即开发者自己定义的实现序列化接口(__sleep __wakeup)的类。这个给我很大灵感,几乎一开始我差点就设计成了类似它的数据结构。

但经过了慎重考量之后,我决定使用和 BSON 类似的方案,原因有二:

1. 格式最接近 JSON,且解析器将兼容 JSON/BSON 数据;

2. 支持数据文本格式化,从而支持更丰富的特性,如注释,因此解析器也将兼容 JSONC(JSON with comments)。

这样,数据不但简洁,而且易于阅读。

由于这个数据结构主要用于 IPC/TCP 通讯和数据存储上,为了尽量压缩其长度以减小带宽和磁盘容量,我决定将其设计为双引号可选,即对于支持可以直接作为 JS 对象属性的拉丁字符,不使用双引号。因此这个新的数据结构的模样将会和一个普通和 JS 对象字面量“一模一样”。并且为了使相似度高度还原,它还支持包括所有进制的数字字面量、支持所有 JS 引号的字符串,正则表达式字面量等。

这个新的数据结构,我将其取名为 FRON/frʌn/,Feature-Rich Object Notation)。

hyurl/fron​github.com
0a31565e0279fb3b1711e9192fb93a61.png

下面是一些 FRON 基本数据类型表示法的示例:

/************************ Literal Types *************************/

除了内置支持的类型之外,FRON 允许使用者注册自定义的类型,从而支持更多类型;并且允许使用别名类型,来把一个新类型注解应用到一个现成的处理方案上,从而实现不同语言偏好上的兼容。另外,FRON 使用了一个内置的复合类型 Reference 来处理数据引用,同时解决了 JSON 引用的重复拷贝和不支持递归引用的问题。

目前 FRON 仅实现了 TypeScript/JavaScript 的 beta 版本,差强人意的是,JS 的运算效率还是跟不上,测试结果表明其序列化和反序列化速度距离 JSON 还有很大距离。为了防止阻塞线程,目前的方案是同时提供了异步版本的函数。虽然如此,在解析过程中依旧需要等待比较长的时间(相对于 JSON)才能够获得最后的结果。

因此,计划是未来使用 rust 这类高性能语言来编写另一个版本,并作为 NodeJS 插件引入,毕竟 IPC/RPC 通信还是要求高响应速度的,光异步处理还远远不够。So, let's keep on.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值