介绍常见的JSON压缩算法

作者:勇哥。已获作者授权发布。

原文地址:

https://blog.csdn.net/qq646350979/article/details/79841556

前言

无论使用何种编程语言,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]
]

彩蛋

我在研究开源性能分析工具pinpoint的源码时,发现了里面有使用一种压缩比更高的做法,算法如下:

原数据:

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

压缩后的示意图如下:

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

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

总结

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

原文发布于微信公众号 - 编程沉思录(code-thinker)

原文发表时间:2018-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

编写可靠 Shell 脚本的 8 个建议

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训。事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条。毫不夸张地说...

12220
来自专栏趣谈编程

synchronized与Lock 擂台之战

面试官:说说synchronized和Lock(或ReentrantLock)的区别 Java 1.5之后,对共享变量访问的协调机制除了之前的synchron...

202100
来自专栏TungHsu

【干货】什么?Python3.X不能输出中文?原来是编辑器geany的锅?!

小白说我要开始学Python了,既然3.X支持中文,那就学3吧。于是安装好Python环境,下载好geany就开始写了。 先写个“Hello World”吧,作...

48360
来自专栏蓝天

转载:x86的cpu_relax解析

内核执行的任务在很多情况下是不加锁的,只是poll某个公有变量去保证同步。再深一步,即使是使用锁,本质上也是一个poll某个公有变量的过程。这个poll的过程需...

14020
来自专栏架构之路

追源索骥:透过源码看懂Flink核心框架的执行流程

写在最前:因为这篇博客太长,所以我把它转成了带书签的pdf格式,看起来更方便一点。想要的童鞋可以到我的公众号“老白讲互联网”后台留言flink即可获取。

3.4K50
来自专栏精讲JAVA

Java并发:隐藏的线程死锁

许多程序员都熟悉Java线程死锁的概念。死锁就是两个线程一直相互等待。这种情况通常是由同步或者锁的访问(读或写)不当造成的。

12030
来自专栏双十二技术哥

深入Weex系列(九)Weex SDK可借鉴细节总结

经过前面五篇文章的源码分析及总结,我们对Weex的整体架构及核心源码都有了清晰的认识。本篇文章主要总结我在Weex SDK源码阅读时觉得可以借鉴的细节。

9210
来自专栏java思维导图

值得收藏!Redis五大数据类型应用场景(二)

Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数...

18820
来自专栏AhDung

【VBS】vbs指定编码保存文本文件(含xml、ini什么的)

- 让用户填写一些信息,待安装完成后把这些信息写入软件安装目录中的指定ini、xml文件中

11710
来自专栏Python爬虫与算法进阶

Katalon + 傻瓜 == selenium 代码

、简直是神器啊 (๑• . •๑)今天在翻莫烦大大的博客时,看到他提到一个工具,便去看了下,第一感受是,太好用了、爱不释手。

30630

扫码关注云+社区

领取腾讯云代金券