摆脱 JSON:Web 开发中数据传输的新方法

摆脱 json:web 开发中数据传输的新方法

如果您一直在 web 开发行业进行编码,那么您很可能非常熟悉 json。这是包罗万象的事实上的标准,从未受到挑战。它无处不在,你已经习惯了。您的所有 rest 调用都通过 json 传输数据。您知道该格式的局限性,并且接受它们。

还是必须这么做?

(注意:所有包和代码的链接都在文章的链接部分)

简史

我的背景是 java 和 javascript/typescript 世界,所以我已经学会了如何处理他们自己的怪癖。许多年前,我开始了一个业余爱好 web 项目(typescript/node),它有一个 json 无法很好解决的问题。

我想摆脱 restful 思维模式,在浏览器和服务器之间实现更轻松、基于消息的传输。为此,我真的很想利用 javascript 类型系统来区分消息。你知道,我们会拥有诸如 adddocument、getusers、givemeallyourmoney 等类。并且我不会拥有许多 http 端点,而是只有一个,并且消息将以更特别的方式从浏览器流向服务器并返回。

但是我并没有真正有一个优雅的解决方案来满足我的需求,因为 json 在序列化过程中会破坏所有类型信息。当然,我可以使用一些专用属性来传输类型,但这需要自定义处理,我只是觉得这不是我想要走的路线。我只是想要一个协议,它可以按原样获取我的对象,并以反序列化时完全相同的方式序列化它。它将保留所有类型信息,仅此而已。所以我需要一个替代方案。

有人可能会说 json 有很多替代品,例如 protocol buffers 或 messagepack。但这些替代方案的本质是它们都是二进制协议。即使当我搜索它们的使用信息时,web 开发也完全不存在。而且我个人觉得没有一个能满足我的要求。

因此,我开始了为自己创建更好的 json 的挑战。

cbot(基于字符的对象传输)协议简介

大约五年前,我通过创建协议的第一个版本开始了这段旅程。那时它还没有名字;我只是将其称为 ejs(增强型 json)。

通过逐步改进,我开发了第二次迭代。现在,有了第三次进化,我将其命名为 cbot,我终于觉得它已经足够成熟,可以介绍给其他可能感兴趣的人。

该协议的主要特点是什么?它们为何如此重要?

正如我之前提到的,该项目的最初火花是在序列化过程中保留类型的能力。但我很快意识到我还可以嵌入更多 json 无法嵌入的信息。

json 有一个坏习惯,就是不保证任何东西。您可以输入任何您喜欢的内容,并且通常必须相信您的 name 属性实际上包含一个字符串而不是布尔值数组。或者您在运行时检查所有内容以确保。当然,有库可以检查模型。但我再次问自己,为什么实际的协议实现不能做到这一点,以便我可以相信反序列化的就是我想要的东西?

此外,json 的原生类型非常有限。例如,json 有一个用于集合的数组。但 javascript 已经有了集合和映射。我也可以添加它们吗?那么日期呢?我曾多次在日期格式上遇到困难。也许您有一个带有时区的约会,也可能没有。它甚至打算拥有一个吗?你永远不会知道,因为 json 并没有真正告诉你任何事情。

所以本质上,我想以某种方式纠正这种缺点。

为什么不是二进制协议?

这是个好问题。第一个原因是,已经存在过多的二进制协议。那么为什么还要创建另一个呢?第二个问题是,如果有更好的替代方案,为什么他们没有在几年前接管 json?一定有充分的理由。

我的猜测很简单,使用 javascript 处理二进制数据并不那么容易。使用字符串更容易。而且 json 很容易被人类理解和查看。当然,浏览器有原生 json 支持。

由于 cbot 的目标是在浏览器环境中工作,因此创建字符协议会更清晰。

它看起来像什么?

本文并不是 cbot 的教程,因为这样的教程已经存在。然而,因为您很可能是一名开发人员/工程师,所以您至少需要对正在发生的事情有某种程度的了解。所以我为此目的制定了一个例子。在示例中,我使用 cbot 作为简单的 json 替代品。使用更高级的功能需要使用元模型,这在实际教程中也有讨论。

但无论如何,这是物体:

{  name: "john smith",  age: 41,  address: {    street: "second avenue",    postalcode: "1356-a",    city: "yorkistan"  },  isniceguy: true,  hobbies: [    "playing cards",    "shopping",    "asking odd questions"  ],  favouritepoem: {    title: "digital dreams",    created: new date("2024-09-16t12:13:00"),    content: "in the code, we drift and weave,n"      + "a dance of data we perceive.n"      + "with each keypress, a world unfolds,n"      + "infinite stories, yet untold."  }}

当该对象转换为 cbot 消息时,它看起来像这样:

112345abbea  nameb  jkjohn smitha !ageb !id41a "addressb "ea #streetb #jksecond avenuea $postalcodeb $jk1356-aa %cityb %jkyorkistanfa &isniceguyb &ieta 'hobbiesb 'cjkplaying cardsjkshoppingjkasking odd questionsda (favouritepoemb (ea )titleb )jkdigital dreamsa *createdb *ih2024-09-16t12:13:00.000+03:00a +contentb +jloin the code, we drift and weave,oa dance of data we perceive.owith each keypress, a world unfolds,ninfinite stories, yet untold.mff

cbot 格式主要是为了机器可读而设计的。它具有可预测且简单的语法,可以被视为一种小型汇编语言。每个命令都由换行符分隔,每行都以一个操作码开头,解释如何构造对象。

因为这种格式是要以编程方式读取的,所以按原样读取并没有任何意义。但是,它可以以反汇编格式可视化,这可以更好地解释内容:

MCSM 12345abbOBJB (plain)  DEFN 0 name  ASGV 0 (name) STRN SSTR John Smith  DEFN 1 age  ASGV 1 (age) NATV FLOAT64 41  DEFN 2 address  ASGV 2 (address) OBJB (plain)    DEFN 3 street    ASGV 3 (street) STRN SSTR Second Avenue    DEFN 4 postalCode    ASGV 4 (postalCode) STRN SSTR 1356-A    DEFN 5 city    ASGV 5 (city) STRN SSTR Yorkistan  OBJE  DEFN 6 isNiceGuy  ASGV 6 (isNiceGuy) NATV BOOLEAN TRUE  DEFN 7 hobbies  ASGV 7 (hobbies) ARRB    STRN SSTR Playing cards    STRN SSTR Shopping    STRN SSTR Asking odd questions  ARRE  DEFN 8 favouritePoem  ASGV 8 (favouritePoem) OBJB (plain)    DEFN 9 title    ASGV 9 (title) STRN SSTR Digital Dreams    DEFN 10 created    ASGV 10 (created) NATV ZONED_DATETIME 2024-09-16T12:13:00.000+03:00    DEFN 11 content    ASGV 11 (content) STRN STBG      STNL In the code, we drift and weave,      STNL A dance of data we perceive.      STNL With each keypress, a world unfolds,      STPA Infinite stories, yet untold.    STEN  OBJEOBJE

在反汇编中,可以看到一些命令、一些解释和数据。以下是操作码的简要摘要:

mcsm 是一个模型校验和,用于验证消息是否被双方理解。objb / obje 表示对象的开始和结束defn / asgv 对意味着首先将索引分配给属性名称,然后 asgv 使用该索引将值分配给对象。因此,如果消息中再次遇到相同的属性名称,则不必重复。sstr sstr 表示一个简单的普通字符串natv float64 表示 64 位浮点数的本机值natv boolean true,你已经猜到了arrb / arre – 对表示数组的开头和结尾natv zoned_datetime 表示分区日期时间,这是 javascript date 的默认值strn、stbg、stnl、stpa 和 sten 是一组定义字符串生成器的指令。由于字符串可能包含换行符并且它们可以无限长,因此使用字符串构建器模式将字符串拆分为更易于管理的部分。

这是 typescript 独有的东西吗?

不,不是。

由于我的背景和用例,实现自然是从 javascript 端开始的。但由于 cbot 与语言无关,因此它也可以扩展到其他语言。事实上,已经有一个有效的 java 实现,基本上支持该协议能够执行的所有操作。

某处有规范吗?

有点。我发现创建一个合适的规范实际上很难做到。我确实尝试使用某种 ebnf 格式来创建一个,但我的第一个问题是这种格式没有单一的规范(讽刺)。只是对它的一堆解释。另外,即使我使用了其中一个版本,我也没有任何方法来实际验证规范的正确性。

因此,我决定创建一个 typescript 文件,其中包含作为类型和类的验证逻辑。我使用该规范文件来验证我的测试。因此,它成为验证规范。该规范文件是其他实现必须用作事实来源的主规范。

该项目目前的状况如何?

正如我现在所写的,我觉得对于大多数用例来说它的功能基本上是完整的。有一些功能需要更多的研究,例如元模型中的枚举、二进制类型支持和不可空属性支持。

然而,我真正需要的是反馈。我知道对于某些人来说,进行 json 替换完全是无稽之谈,而 typescript 闻起来就像放屁。但是那些真正认为 cbot 可以解决用例的人,我想知道它的表现如何,哪些支持被认为是重要的。

本质上,下一步只是获得一些建设性的反馈,以确保协议能够稳定到第一个实际版本。

链接

联系方式:sisujs@sisujs.figit:https://gitlab.com/sisujs/sisujs/

存储库

npm:https://www.npmjs.com/package/@sisujs/meta-cbotmvn:https://mvnrepository.com/artifact/fi.sisujs/cbot

文档

typescript 教程:https://gitlab.com/sisujs/sisujs/-/blob/main/docs/cbot/tutorial_ts.mdjava 教程:https://gitlab.com/sisujs/sisujs/-/blob/main/docs/cbot/tutorial_java.md类型文档:https://gitlab.com/sisujs/sisujs/-/blob/main/js/meta-cbot/typedoc/readme.mdjavadoc:https://www.javadoc.io/doc/fi.sisujs/cbot/latest/index.html

以上就是摆脱 JSON:Web 开发中数据传输的新方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1493186.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用 Github 页面部署 React Nextjs 应用程序的步骤
上一篇 2025年12月19日 15:28:32
优化代码性能最佳实践
下一篇 2025年12月19日 15:28:41

相关推荐

  • Gateway电脑修复蓝屏代码0x00000019的完整步骤。

    Gateway电脑修复蓝屏代码0x00000019的完整步骤。Gateway电脑修复蓝屏代码0x00000019的完整步骤。Gateway电脑修复蓝屏代码0x00000019的完整步骤。Gateway电脑修复蓝屏代码0x00000019的完整步骤。

    %ignore_a_1%错误0x00000019通常由内存或硬盘问题引起,需依次排查:首先重新安装并清洁内存条,确保接触良好;其次运行Windows内存诊断工具检测硬件错误;接着更新或回滚驱动程序,特别是存储与显卡驱动;然后使用SFC和DISM命令修复系统文件;最后通过chkdsk及硬盘厂商工具检查…

    2026年10月2日 • 用户投稿
    100
  • OpenAI 发布新编程模型 GPT‑5‑Codex,优化 Agentic Coding 能力

    OpenAI 发布新编程模型 GPT‑5‑Codex,优化 Agentic Coding 能力OpenAI 发布新编程模型 GPT‑5‑Codex,优化 Agentic Coding 能力OpenAI 发布新编程模型 GPT‑5‑Codex,优化 Agentic Coding 能力OpenAI 发布新编程模型 GPT‑5‑Codex,优化 Agentic Coding 能力

    openai 今日凌晨推出全新升级的新模型 gpt‑5‑codex,这是其在gpt-5基础上专门为软件工程优化的模型版本,进一步提升了codex中的智能体编程(agentic coding)能力。 官方表示,该版本在代码审查、功能开发、大规模重构等场景中表现显著提升,并且“在测试中可连续独立工作超过…

    2026年10月2日 • 用户投稿
    100
  • 反转字符串绕杀软

    反转字符串绕杀软反转字符串绕杀软反转字符串绕杀软反转字符串绕杀软

    在github有一个ssi的项目,项目地址如下:https://github.com/dimopouloselias/simpleshellcodeinjector/他可以实现shellcode的远程加载(十六进制),当然ldrakura也曾经搞过类似的项目(我偷电瓶车养你啊),当时还是一次项目时绕…

    2026年10月2日 • 用户投稿
    100
  • 命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型

    命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型

    openai 为其命令行工具 codex cli 推出了全新 0.36.0 版本,重磅集成了先进的 gpt-5-codex 模型,大幅提升了代码生成效率、逻辑推理能力及输出质量。本次更新还新增了通过 agents.md 文件对 ai 行为进行精细化管理的功能。 Codex CLI 是一款轻量级 AI…

    2026年10月2日 • 用户投稿
    300
  • 编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首

    编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首

    微软推出令人耳目一新的命令行工具,迅速登顶github趋势榜首! 这不再是你记忆中的传统命令行。 许多用户对Windows系统上黑底白字的命令行界面感到厌倦: 然而,在昨天的微软全球开发者大会 Build 2019上,微软推出的Windows Terminal引起了全场的惊叹——命令行界面竟然可以如…

    2026年10月2日 • 用户投稿
    100
  • 阿里通义实验室发布端到端语音识别大模型 FunAudio-ASR

    阿里通义实验室发布端到端语音识别大模型 FunAudio-ASR阿里通义实验室发布端到端语音识别大模型 FunAudio-ASR阿里通义实验室发布端到端语音识别大模型 FunAudio-ASR阿里通义实验室发布端到端语音识别大模型 FunAudio-ASR

    阿里巴巴通义实验室推出了全新的端到端语音识别大模型 funaudio-asr。该模型引入创新的 context 模块,显著提升了在高噪声环境下的识别稳定性,将幻觉率从 78.5% 大幅下降至 10.7%,降幅接近 70%。 FunAudio-ASR 基于数千万小时的真实音频数据训练而成,并深度融合了…

    2026年10月2日 • 用户投稿
    300
  • sublime怎么汉化

    sublime怎么汉化sublime怎么汉化sublime怎么汉化sublime怎么汉化

    Sublime Text 可以通过以下步骤汉化:1. 下载汉化包;2. 安装汉化包;3. 重启 Sublime Text;4. 设置默认语言(可选);5. 校验汉化。 如何汉化 Sublime Text 步骤 1:下载汉化包 访问以下链接,下载汉化包:https://github.com/Subli…

    2026年10月2日 • 用户投稿
    100
  • 数毛社评《明末》主机性能表现:XSS版本明显落后

    数毛社评《明末》主机性能表现:XSS版本明显落后数毛社评《明末》主机性能表现:XSS版本明显落后数毛社评《明末》主机性能表现:XSS版本明显落后数毛社评《明末》主机性能表现:XSS版本明显落后

    日前,知名技术媒体digital foundry(数毛社)发布了国产虚幻5引擎打造的类魂动作游戏《明末:渊虚之羽》的技术评测(基于早期测试版本,非最新1.5版),重点解析了该作在ps5、ps5 pro以及xbox series x|s主机上的性能表现。 视频: 分析指出,《明末:渊虚之羽》虽在玩法上…

    2026年10月2日 • 用户投稿
    200
  • 将 DSA 密钥库证书转换为 RSA 的替代方案

    将 DSA 密钥库证书转换为 RSA 的替代方案将 DSA 密钥库证书转换为 RSA 的替代方案将 DSA 密钥库证书转换为 RSA 的替代方案将 DSA 密钥库证书转换为 RSA 的替代方案

    本文档旨在提供将使用 DSA 算法生成的密钥库证书迁移到 RSA 算法的替代方案,以解决在高版本 Java 环境下(如 Java 11 及以上)不再支持 DSA 算法的问题。由于 DSA 证书无法直接转换为 RSA 证书,本文将探讨通过创建新的 RSA 密钥库并重新签名应用来解决此问题的方法。 由于…

    2026年10月2日 • 用户投稿
    100
  • 在Android应用中捕获并分享MPAndroidChart图表截图

    在Android应用中捕获并分享MPAndroidChart图表截图在Android应用中捕获并分享MPAndroidChart图表截图在Android应用中捕获并分享MPAndroidChart图表截图在Android应用中捕获并分享MPAndroidChart图表截图

    本教程详细介绍了如何在Android应用中,利用MPAndroidChart库的图表功能,高效地捕获BarChart(或其他支持的图表)的屏幕截图,并无需将图片永久保存到本地存储,即可通过Android的Intent机制将其无缝分享至其他社交媒体或应用。文章涵盖了从获取图表Bitmap到构建分享In…

    2026年10月2日 • 用户投稿
    500
  • 如何在MPAndroidChart中捕获图表截图并使用Intent进行分享

    如何在MPAndroidChart中捕获图表截图并使用Intent进行分享如何在MPAndroidChart中捕获图表截图并使用Intent进行分享如何在MPAndroidChart中捕获图表截图并使用Intent进行分享如何在MPAndroidChart中捕获图表截图并使用Intent进行分享

    本文详细介绍了如何在Android应用中,利用PhilJay / MPAndroidChart库,高效地捕获BarChart(或其他图表)的屏幕截图,并无需将图片永久保存到设备存储,即可通过Android的Intent机制将其分享至其他社交媒体或应用。教程涵盖了获取图表位图、生成临时URI以及构建分…

    2026年10月2日 • 用户投稿
    200
  • Symfony 5与Mercure实时通信集成:配置、启动与常见访问问题排查

    本文详细介绍了如何在Symfony 5项目中集成Mercure实时通信服务。内容涵盖Mercure Hub的安装、环境变量配置、服务器启动命令,并着重解决了初次配置时常见的Mercure Hub访问问题,强调了URL端口一致性的重要性,确保开发者能顺利构建实时应用。 Mercure实时通信服务概述 …

    2026年10月2日
    200
  • 掌握MPAndroidChart图表截图与Intent分享技巧

    掌握MPAndroidChart图表截图与Intent分享技巧掌握MPAndroidChart图表截图与Intent分享技巧掌握MPAndroidChart图表截图与Intent分享技巧掌握MPAndroidChart图表截图与Intent分享技巧

    本教程详细介绍了如何在Android应用中,利用MPAndroidChart库的内置功能捕获图表(如BarChart)的屏幕截图,并结合Android的Intent机制,实现将生成的图表图片无缝分享至其他社交媒体或应用程序,整个过程无需用户手动保存图片到特定文件夹,提升用户体验和应用功能性。 在现代…

    2026年10月2日 • 用户投稿
    500
  • 解决SublimeText插件安装失败的多种原因

    解决SublimeText插件安装失败的多种原因解决SublimeText插件安装失败的多种原因解决SublimeText插件安装失败的多种原因解决SublimeText插件安装失败的多种原因

    sublime text插件安装失败的原因主要包括网络问题、package control问题、配置错误和版本不兼容。解决方法包括:1.检查网络连接,确保连接正常;2.更新package control,通过快捷键打开并升级;3.手动安装插件,下载并放置到packages目录;4.检查插件兼容性,确…

    2026年10月2日 • 用户投稿
    100
  • 基于一次性密码(OTP)验证的安全性分析与设计建议

    基于一次性密码(OTP)验证的安全性分析与设计建议基于一次性密码(OTP)验证的安全性分析与设计建议基于一次性密码(OTP)验证的安全性分析与设计建议基于一次性密码(OTP)验证的安全性分析与设计建议

    一次性密码(OTP)作为一种常见的身份验证方式,被广泛应用于邮箱验证、手机号码验证等场景。然而,在OTP系统的设计和实现过程中,如果考虑不周,可能会存在潜在的安全风险。本文将深入探讨这些风险,并提供一些设计建议,以帮助开发者构建更安全的OTP验证系统。 在用户注册但尚未验证邮箱的情况下,存在一种潜在…

    2026年10月2日 • 用户投稿
    200
  • win11数字权利激活是什么意思_数字许可证激活机制详解

    win11数字权利激活是什么意思_数字许可证激活机制详解win11数字权利激活是什么意思_数字许可证激活机制详解win11数字权利激活是什么意思_数字许可证激活机制详解win11数字权利激活是什么意思_数字许可证激活机制详解

    Windows 11通过数字权利自动激活,无需输入密钥;该机制将许可证与硬件或微软账户绑定,可在“设置-系统-激活”中查看状态,登录微软账户可云端同步激活信息,使用slmgr.vbs命令可查询或管理激活详情。 如果您尝试激活Windows 11系统,但发现没有输入产品密钥的选项,或者系统提示已自动激…

    2026年10月2日 • 用户投稿
    200
  • SublimeText插件安装的正确方法与常见问题解决

    SublimeText插件安装的正确方法与常见问题解决SublimeText插件安装的正确方法与常见问题解决SublimeText插件安装的正确方法与常见问题解决SublimeText插件安装的正确方法与常见问题解决

    sublimetext插件的安装方法有两种:1.通过package control:先安装package control,按ctrl+shift+p(windows/linux)或cmd+shift+p(mac)打开,输入并选择install package,再输入插件名称安装。2.手动安装:下载插…

    2026年10月2日 • 用户投稿
    100
  • Mac如何安装Homebrew_Homebrew for Mac安装与配置教程

    Mac如何安装Homebrew_Homebrew for Mac安装与配置教程Mac如何安装Homebrew_Homebrew for Mac安装与配置教程Mac如何安装Homebrew_Homebrew for Mac安装与配置教程Mac如何安装Homebrew_Homebrew for Mac安装与配置教程

    首先检查系统是否已安装Homebrew,若未安装则需先安装Xcode命令行工具,再通过官方脚本一键安装Homebrew,接着根据shell类型配置环境变量,最后验证安装结果。 如果您在使用Mac时需要便捷地管理命令行工具和软件包,但缺乏高效的包管理方式,则可以通过安装Homebrew来简化这一过程。…

    2026年10月2日 • 用户投稿
    100
  • 配置SublimeText自动保存功能的参数

    配置SublimeText自动保存功能的参数配置SublimeText自动保存功能的参数配置SublimeText自动保存功能的参数配置SublimeText自动保存功能的参数

    sublime text 的自动保存功能可以通过在用户设置文件中添加 {“save_on_focus_lost”: true} 来启用。1) 按 ctrl + ,(windows)或 cmd + ,(mac)打开设置文件。2) 添加上述代码实现自动保存。3) 结合使用版本控制…

    2026年10月2日 • 用户投稿
    200
  • 如何利用 Goto Anything 快速定位文件 / 符号?

    如何利用 Goto Anything 快速定位文件 / 符号?如何利用 Goto Anything 快速定位文件 / 符号?如何利用 Goto Anything 快速定位文件 / 符号?如何利用 Goto Anything 快速定位文件 / 符号?

    goto anything 是 sublime text 中提升代码导航效率的核心工具。它支持通过输入文件名、路径、符号名或行号,实现快速定位。具体使用方式包括:1. 文件查找:输入文件名或用 / 指定路径;2. 符号查找:输入 @ 加符号名;3. 行号跳转:输入 : 加行号;4. 支持多项目搜索并…

    2026年10月2日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信