json 压缩算法详解

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数据键的大小,但是里面的中括号和引号都无用且大量冗余,我上面介绍的这种压缩方法使用起来复杂度可能高一点,但是压缩比可以比上面的两种更好一些,不管是作为存储还是作为数据的传输,都可以节省大量的资源。

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值