json 压缩算法详解

news2024/11/15 20:40:31

aa06e92bb75b4b92ab2b3ca6a5697385.jpg


 概要

 

无论使用何种编程语言,json格式的数据已被广泛应用,不论是数据的传输还是存储,在很多应用场景下,你可能想进一步地压缩JSON字符串的长度,以提升传输效率,如果你使用的是nosql数据库,你可能想进一步的压缩json字符串的长度来节省你的存储空间,接下来,我将介绍一下目前最常用的json数据压缩技术(CJSON和HPack)的实现

一、 CJSON

CJSON 的压缩算法, 主要是将资料抽离成 Template 与 Value,节省掉重复的 "Key 值".

原数据:

[{
  "x": 100,
  "y": 100
 }, {
  "x": 100,
  "y": 100,
  "width": 200,
  "height": 150
 }
]

压缩之后:

{
 "templates": [
  [0, "x", "y"],
  [1, "width", "height"]
 ],
 "values": [{
  "values": [1, 100, 100]
 }, {
  "values": [2, 100, 100, 200, 150]
 }, {}]
}

二、HPack

HPack 的压缩算法, 也是将 Key, Value 抽离, 阵列中第一个值, 就是 HPack 的 Template, 后面依序就是 Value.

原数据:

[{
 "name": "Andrea",
 "age": 31,
 "gender": "Male",
 "skilled": true
}, {
 "name": "Eva",
 "age": 27,
 "gender": "Female",
 "skilled": true
}, {
 "name": "Daniele",
 "age": 26,
 "gender": "Male",
 "skilled": false
}]

压缩之后:

[
 ["name", "age", "gender", "skilled"],
 ["Andrea", 31, "Male", true],
 ["Eva", 27, "Female", true],
 ["Daniele", 26, "Male", false]
]

彩蛋

经过上述的介绍,都是按照json格式的方式经尽可能的压缩,但是有没有一种压缩比更高的做法呢,例如json 格式中的 大中括号 冒号逗号之类的东西都可以去掉,但是又需要能够携带各种数据类型和字段结构,protocol buffer协议了解下?

  • Protocol Buffer 和 XML、JSON一样都是结构数据序列化的工具,但它们的数据格式有比较大的区别:

    • 首先,Protocol Buffer 序列化之后得到的数据不是可读的字符串,而是二进制流

    • 其次,XML 和 JSON 格式的数据信息都包含在了序列化之后的数据中,不需要任何其它信息就能还原序列化之后的数据;但使用 Protocol Buffer 需要事先定义数据的格式(.proto 协议文件),还原一个序列化之后的数据需要使用到这个定义好的数据格式

    • 最后,在传输数据量较大的需求场景下,Protocol Buffer 比 XML、JSON 更小(3到10倍)、更快(20到100倍)、使用 & 维护更简单;而且 Protocol Buffer 可以跨平台、跨语音使用 例如:

原数据:

{
  name : "Andrea",
  age : 31,
  gender : "Male",
  skilled : true
}

压缩后的示意图如下:

9dacb0ba0ab64b0aaa3f608379cd31eb.png

 压缩之后的数据变成了一串二进制数据,其中 name 和 gender 由于是 string 类型,长度不定,故使用他们的第一个四位数作为表示这个该name 对应值“Andrea”的二进制长度,其他类型的数据取值如下图的API:

9b3704de65824809bbe0b028382fc5af.png

 这样的做法可以被认为是一种加密性质的压缩,如果数据接收方不知道数据结构,是无法直接解析出目标值的。需要数据发送发和数据接收方约定好字段的结构。

从上面的例子中,我们发现,CJSO和HPack 都只是节省了 json数据键的大小,但是里面的中括号和引号都无用且大量冗余,我上面介绍的这种压缩方法使用起来复杂度可能高一点,但是压缩比可以比上面的两种更好一些,不管是作为存储还是作为数据的传输,都可以节省大量的资源。

 

欢迎点赞收藏转发,感谢🙏

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2012年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

🏠个人主页:fo安方的博客✨ 💂个人简历:大家好,我是fo安方,考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。🐳 💕兴趣爱好:b站天天刷&…

记一次tomcat版本升级导致的现网问题

前言 最近公司项目做安全漏洞审查,把一批服务的fastjson,tomcat,log4j版本做升级,那天上线了50个服务,所有服务上线之后,现网有客服反馈录音笔下单异常。查询了现网日志,发现适配服务有异常信息,报错信息如…

闲人闲谈PS之四十二——顾问的“禁忌之地”—制造能力计划

惯例闲话:上个月有幸成为乐老师乐谈IT系列培训课程的讲师,分享主题是,PS在装备制造和工程行业的应用。虽然培训规模不是很大,但是闲人很有信心,至少在小范围之内,参与培训的听友人来说,PS一直以…

什么条件下会出现死锁,如何避免?

文章目录 一、什么是死锁二、产生死锁的原因:三、如何避免死锁: 一、什么是死锁 死锁,简单来说就是两个或者两个以上的线程在执行过程中,去争夺同一个共享资源导致相互等待的现象。如果没有外部干预,线程会一直处于阻塞…

图像的算术操作

1.图像的加法 用途:图像的合成 Rain图片View图片 合成代码: import numpy as np import cv2 as cv import matplotlib.pyplot as pltrain cv.imread(rain.png) plt.imshow(rain[:, :, ::-1]) plt.show()view cv.imread(view.png) plt.imshow(view…

773. 滑动谜题

链接&#xff1a;773. 滑动谜题 题解&#xff1a;https://blog.csdn.net/INGNIGHT/article/details/131350054 滑动拼图 II class Solution { public:int slidingPuzzle(vector<vector<int>>& board) {// 异常判断if (board.size() < 0 || board[0].size…

怎么管理好一个团队?

一个成功的企业需要一个高效、有能力、积极的团队来支持其业务运营。管理一个团队需要领导者具备一定的技能和知识&#xff0c;怎么管理好一个团队对于许多企业领导者而言也是一项不小的挑战。对此&#xff0c;我想首先推荐一本非常优秀的团队书籍——《经理人参阅&#xff1a;…

js vuejs dagre-d3绘制流程图实用指南 有向图可视化

写在前面 之前有小伙伴问我如何使用 D3 在前端绘制流程图,今天在这里给安排上,与大家分享。 明确一点,只要你的数据计算能力足够强,使用原生D3绘制流程图绝对可以的,但是,为了让大家更容易上手,避免重复造轮子,给大家推荐一个专门绘制流程图的 D3 插件 dagre-d3。 首…

idea tomcat js 汉字乱码

Run/Debug Configuiations->VM options:-Dfile.encodingUTF-8

服务 第七章

目录 1.tomcat 核心组件 2.处理请求&#xff0c;内部数据流向 3.请求处理过程 4.主要目录说明 5.tomcat 优化 6.总结 1.tomcat 核心组件 2.处理请求&#xff0c;内部数据流向 3.请求处理过程 4.主要目录说明 5.tomcat 优化 6.总结 tomcat 属于轻量级应用服务器&#xf…

基于Tars高并发IM系统的设计与实现-基础篇1

基于Tars高并发IM系统的设计与实现–基础篇1 作者简介 兰怀玉 毕业于中央民族大学计算机专业 先后供职国内外多家公司软件研发设计岗位&#xff0c;有丰富的软件研发经验。 从事IM领域设计研发十余年&#xff0c;先后领衔多个IM通讯系统设计与研发发&#xff0c;拥有丰富的IM…

裂墙推荐!阿里大牛新产Java面试速成指南,主打就是躺着拿Ofeer

很多粉丝后台留言&#xff0c;Java程序员面临的竞争太激烈了…… 我自己也有实感&#xff0c;多年身处一线互联网公司&#xff0c;虽没有直面过求职跳槽的残酷&#xff0c;但经常担任技术面试考官&#xff0c;对程序员招聘市场的现状很清楚。导致现在激烈竞争的原因不外乎三方面…

移动端数据可视化设计

在做APP设计的时候&#xff0c;难免会遇到一些需要展示数据的场景。使用传统的表格和文档展示数据不仅难看&#xff0c;也影响用户理解数据的含义。而数据可视化设计能将数据以更加直观的方式展现出来&#xff0c;使数据更加客观、更有说服力。 在移动应用中&#xff0c;数据可…

uview-plus上传图片,upload组件带参数上传

一、引入uview-plus 请自行在项目中引入uview-plus组件库&#xff0c;此处不多赘述 二、使用 html 部分&#xff0c;上传组件的样式自己去定义&#xff0c;不多赘述 <u-upload:fileList"fileList" // 文列列表afterRead"afterRead" // 读取后的…

03双向链表

双向链表 单向链表的缺点 单向链表&#xff0c;只能是一个方向来查找&#xff0c;而双向链表可以向前或者向后查找。单向链表不能自我删除&#xff0c;需要靠辅助结点。而双向链表可以自我删除。所以我们单链表删除结点的时候&#xff0c;总要找到temp&#xff08;待删除结点…

python+requests库使用时报错:ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1131)

本人测试小白~第一次用pythonunittestrequest做接口测试的学习时&#xff0c;一直报这个ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1131) 反复检查代码也没有发现什么问题&#xff0c;然后在网上找了很多方法&#xff0c;最终解决这个问题的方法…

BUUCTF 世上无难事 1

题目描述&#xff1a; 以下是某国现任总统外发的一段指令&#xff0c;经过一种奇异的加密方式&#xff0c;毫无规律&#xff0c;看来只能分析了。请将这段语句还原成通顺语句&#xff0c;并从中找到key作为答案提交&#xff0c;答案是32位&#xff0c;包含小写字母。 注意&…

三层交换机实现不同VLAN的数据转发

实验环境&#xff1a; 思科模拟器&#xff0c;Cisco Packet Tracer 实验拓扑&#xff1a; 实验配置&#xff1a; &#xff08;1&#xff09;PC配置 IP子网掩码网关PC1192.168.10.1255.255.255.0192.168.10.254PC2192.168.10.2255.255.255.0192.168.10.254PC3192.168.20.325…

Mybatis - 统计SQL执行时间

由于系统数据量较大&#xff0c;SQL执行十分低效&#xff0c;我们在做数据库优化时&#xff0c;想在日志中看到每个SQL执行的时间&#xff0c;以方便针对性的优化 一、切面编程Aspect 此方案主要是通过环绕切面的方式将mapper包下的接口方法&#xff0c;然后前后计算时间差即…

C语言初阶之结构体

结构体 1. 结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化 2. 结构体成员的访问3. 结构体传参 1. 结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。…