前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >介绍常见的JSON压缩算法

介绍常见的JSON压缩算法

作者头像
Bug开发工程师
发布2018-04-17 13:36:51
6.9K0
发布2018-04-17 13:36:51
举报
作者:勇哥。已获作者授权发布。

原文地址:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档