0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JSON压缩算法解读

共熵服务中心 来源:未知 2022-11-23 19:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

646e29d6-6b1e-11ed-8abf-dac502259ad0.png

文章转发自51CTO 开源基础软件社区 OpenHarmony成长计划啃论文俱乐部【FFH】啃论文俱乐部---JSON压缩算法解读

1.关于作者

大家好!我是来自深圳技术大学FSR Lab(编者注:Falcon Swarm Robotics Lab猎鹰集群机器人控制实验室的缩写)的同学,标题FFH就是FSRlab For Harmony!并且我也正在参加OpenHarmony成长计划从论文到开源提交研究,以后我们也会陆续在这个社区记录学习心得和体会。

在OpenHarmony成长计划啃论文俱乐部里,FFH小组同学们与华为、软通动力、润和软件、拓维信息、深开鸿等公司一起,学习和研究序列化相关技术…

2. 为什么需要压缩JSON?

尽管JSON数据格式比XML效率要高,但是它仍然是web服务器和浏览器传输过程中比较低效的数据格式。为什么呢?

  • 首先,它将所有的内容都转换为了文本。

  • 第二是转换之后的文本过度使用引号,这样会给每个字符串添加多两个字节。

  • 第三,它本身没有schema的标准格式,比如在一个消息中序列化多个对象的时候,即使每个对象的属性的键名是重复且相同的,但是转换后的文本数据还是会重复每一个键名。

JSON以前的时候有一个优势,就是可以被Javascript引擎直接解析,但因为现在越来越重视安全性,JSON的这个优势也逐渐消失了,但是因为它比XML效率以及性能都更高,所以许多传统的C/S模式都是选择JSON,比如web服务。当有庞大的数据量以及复杂数据结构需要从web浏览器中传输到服务器的时候,JSON压缩就起到了非常大的作用,然而中间就会存在我们刚刚说的三点问题,我们也不能使用传统的gzip压缩算法,因为浏览器不知道服务器是否支持gzip解压。

下面我们就来看看两种常见的JSON压缩算法,cJSON与HPack。

3. cJSON压缩算法

cJSON压缩算法(cJSON Compression Algorithm)的特点就是可以使用自动类型提取压缩JSON数据格式的内容。它成功解决了一个非常重要的问题,就是我们上一小节提到的第三点,将不断重复的键名舍去了,我们我们来看一个例子:

使用cJSON前的数据格式:

[
    {   //表示一个坐标点
        "x":100,
        "y":100
    },
    {   //表示一个长方形
        "x":100,
        "y":100,
        "width":200,
        "height":150
    },
    {},//表示一个空对象
    ... //以下省略数以万计的对象
]

上面未经压缩的数据中,我们可以看到有非常多的空间被重复的键名所占据,比如“x”,“y”等等,当数据非常多的时候,这些看起来不起眼的重复键名会给传输效率带来非常大的影响,其实解决思路也非常简单,因为他们是重复的,那我们只存储一次不就好了?下面我们来按照我们的思路看看cJSON处理过后的数据吧。

{
    "templates":[
        ["x","y"],  //type1
        ["x","y","width","height"] //type2
    ],
    "value":[
        {    //第一个对象:坐标点
            "type":1,
            "values":[
                100,
                100
            ] 
        },
        {    //第二个对象:矩形
            "type":2,
            "values":[
                100,
                100,
                200,
                150
            ]   
        },
        {
            //第三个空对象
        },
        //以下省略数以万计的对象......
    ]
}

从上面的数据中我们可以看到,我们格式化了数据,把键名存储了起来,重复的就不存储,然后值通过“type”索引来对应键名,这样在数据量庞大的时候确实减少了不少空间,但是我们仔细看“templates”内的键名依旧有重复的字段存在。说明了我们还存在优化空间,优化完压缩后效果如下:

{  "function": "cjson",
   "templates": [ 
           [0, "x", "y"],
           [1, "width",  "height"] 
       ],  
   "values": [ 
           [1, 100, 100 ],           //第一个对象:坐标点
           [2, 100, 100, 200, 150 ], //第二个对象:矩形
           []                        //第三个空对象
       ] 
}

直接看压缩后的代码结构你可能不太能理解,那我们就来看看他的具体原理,为了解决“template”内键名重复的字段,这个算法采用了树这个数据结构,每遇到一个要传输的对象,就按顺序把键值存入树的节点中(灰色的节点是被标记的结尾节点指针,表示该节点存储的是某个对象最后一个属性的键值),重复的就不存储,这样就解决了我们的问题,这个键值树的变化过程如下:

65312ac6-6b1e-11ed-8abf-dac502259ad0.png

最后数据在匹配键值的时候就根据 “values” 中所标记的结尾节点指针找到对应键值数组,这样就构成了cJSON的压缩算法。

仔细的同学就会发现,如果一个对象中没有"X"和"Y",只有“width”和“height”,或者键值节点顺序是错的,是不是会出问题?答案是对的,会出现无法匹配的键值的情况,所以这种方法只能在特定的场景下应用,存在一定局限性。

总体来说,cJSON在处理非常庞大的数据量的时候效果还是非常客观的。

4.JSON.HPack压缩算法

JSON.HPack压缩算法(HPack Compression Algorithm)是一种无损、跨语言、注重性能的JSON数据压缩算法,可以让我们在使用post请求在客户端发送数据到服务器的过程中相对普通JSON格式节省约70%的字符。

其原理本质上也是跟cJSON一样将键值抽离开,举个例子:

使用HPack算法前:

{   
    "id" : 1,  
    "sex" : "Female",  
    "age" : 38,  
    "classOfWorker" : "Private",  
    "maritalStatus" : "Married-civilian  spouse present",  
    "education" : "1st 2nd 3rd or 4th  grade",  
    "race" : "White" 
}

使用HPack算法后:

["id","sex","age","classOfWorker","mari talStatus","education","race"],
[1,"Female",38,"Private","Married-civilianspousepresent","1st2nd3rdor4thgrade","White"]

可以看到相对于普通JSON以及cJSON少了很多字符,比如引号,各种括号等等,这种压缩算法在数据量庞大的情况下效果也非常可观。

HPack算法提供了几个级别的压缩(从0到4)。等级越高压缩效率越高,每提升一个等级都有引入附加功能。0级压缩通过从结构中分离键值来执行最基本的压缩,并在索引0的元素上创建键名数组,下一个等级就可以通过假设存在重复条目来进一步减小JSON数据的大小。

5.性能分析

接下来我们直接用数据来看看这几个压缩算法的压缩效率,我们分别用5组大小不同的JSON文件(50KB~1MB),每个JSON文件将使用servlet容器(tomcat)提供给浏览器,并分别用以下算法进行压缩:

  • Original JSON size - 未作修改的JSON数据

  • Minimized - 删除空白和新行(最基本的js优化)

  • Compresse cJSON - 使用CJSON压缩算法进行JSON压缩

  • Compresse HPack - 使用JSON.HPack压缩算法进行JSON压缩

  • Gzipped - 使用gzip和进行JSON压缩

  • Gzipped + Minimized - 使用gzip和删除空白和新行(最基本的js优化)进行JSON压缩

  • Gzipped + Compresse cJSON - 使用gzip和CJSON压缩算法进行JSON压缩

  • Gzipped + Compresse HPack - 使用gzip和JSON.HPack压缩算法进行JSON压缩

下表(TABLE I.RESULTES)是用以上各种方式处理完后的JSON数据大小(bytes),不同列表示不同的JSON数据集,不同行表示使用不同的压缩方式。

65581424-6b1e-11ed-8abf-dac502259ad0.png

下面第一个图表Y轴表示JSON数据大小(bytes):

6582fcd4-6b1e-11ed-8abf-dac502259ad0.png

第二张图Y轴是JSON数据大小的百分比(%),原始数据为100%:

65bb7320-6b1e-11ed-8abf-dac502259ad0.png

从上面的几个图表中我们可以直观地看到,单独使用cJSON可以把原始数据大小压缩到45%左右,单独使用HPack可以把原始数据大小压缩到8%左右,可见整体上HPack是优于cJSON的。

然而我们可以看到当使用gzip和上面提到的两个压缩算法相结合进行JSON压缩,效果才是最优的,基本可以达到1%~2%的压缩率。

总的来说,HPack比cJSON效率更高,速度也更快,但是在使用压缩算法进行传输的过程中,接收的一端需要进行相应的解压缩操作,否则无法使用被压缩过后的JSON数据,这一步也会存在一定的性能开销,在我们选择使用JSON压缩的时候,也需要考虑到这一点。当可以使用gzip进行压缩的时候,这种方法比其他压缩算法的效率都高,当两者同时结合起来,效果显而易见。

好了,我们这一次完整地了解了JSON序列化的发展,规范,应用以及相关的压缩算法,相信大家不仅对JSON压缩算法有了更深的了解,也对JSON序列化这个技术领域有了深刻的认识。

6.参考文献

JSON Compression Algorithmshttp://repository.utm.md/bitstream/handle/5014/6418/ICMCS_2011_1_pg_244_247.pdf?sequence=1

<本文完>

写在最后

OpenHarmony 成长计划—“啃论文俱乐部”(以下简称“啃论文俱乐部”)是在 2022年 1 月 11 日的一次日常活动中诞生的。截至 3 月 31 日,啃论文俱乐部已有 87 名师生和企业导师参与,目前共有十二个技术方向并行探索,每个方向都有专业的技术老师带领同学们通过啃综述论文制定技术地图,按“降龙十八掌”的学习方法编排技术开发内容,并通过专业推广培养高校开发者成为软件技术学术级人才。

啃论文俱乐部的宗旨是希望同学们在开源活动中得到软件技术能力提升、得到技术写作能力提升、得到讲解技术能力提升。大学一年级新生〇门槛参与,已有俱乐部来自多所高校的大一同学写出高居榜首的技术文章。

如今,搜索“啃论文”,人们不禁想到、而且看到的都是我们——OpenHarmony 成长计划—“啃论文俱乐部”的产出。

65d7c52a-6b1e-11ed-8abf-dac502259ad0.jpg

66146b92-6b1e-11ed-8abf-dac502259ad0.jpg

662b13ec-6b1e-11ed-8abf-dac502259ad0.jpg

OpenHarmony开源与开发者成长计划—“啃论文俱乐部”学习资料合集

1)入门资料:啃论文可以有怎样的体验

https://docs.qq.com/slide/DY0RXWElBTVlHaXhi?u=4e311e072cbf4f93968e09c44294987d

2)操作办法:怎么从啃论文到开源提交以及深度技术文章输出https://docs.qq.com/slide/DY05kbGtsYVFmcUhU

3)企业/学校/老师/学生为什么要参与 & 啃论文俱乐部的运营办法https://docs.qq.com/slide/DY2JkS2ZEb2FWckhq

4)往期啃论文俱乐部同学分享会精彩回顾:

同学分享会No1.成长计划啃论文分享会纪要(2022/02/18)https://docs.qq.com/doc/DY2RZZmVNU2hTQlFY

同学分享会No.2 成长计划啃论文分享会纪要(2022/03/11)https://docs.qq.com/doc/DUkJ5c2NRd2FRZkhF

同学们分享会No.3 成长计划啃论文分享会纪要(2022/03/25)

https://docs.qq.com/doc/DUm5pUEF3ck1VcG92?u=4e311e072cbf4f93968e09c44294987d

现在,你是不是也热血沸腾,摩拳擦掌地准备加入这个俱乐部呢?当然欢迎啦!啃论文俱乐部向任何对开源技术感兴趣的大学生开发者敞开大门。

66710b54-6b1e-11ed-8abf-dac502259ad0.png

扫码添加 OpenHarmony 高校小助手,加入“啃论文俱乐部”微信群

后续,我们会在服务中心公众号陆续分享一些 OpenHarmony 开源与开发者成长计划—“啃论文俱乐部”学习心得体会和总结资料。记得呼朋引伴来看哦。

6688276c-6b1e-11ed-8abf-dac502259ad0.gif

669befa4-6b1e-11ed-8abf-dac502259ad0.png

66d12a0c-6b1e-11ed-8abf-dac502259ad0.png

6700d540-6b1e-11ed-8abf-dac502259ad0.png

6786f7c4-6b1e-11ed-8abf-dac502259ad0.png

67c90f56-6b1e-11ed-8abf-dac502259ad0.png

67f68972-6b1e-11ed-8abf-dac502259ad0.png

6814e372-6b1e-11ed-8abf-dac502259ad0.png

6853c2f4-6b1e-11ed-8abf-dac502259ad0.png

68f83c8a-6b1e-11ed-8abf-dac502259ad0.png

691b1836-6b1e-11ed-8abf-dac502259ad0.png

6949b696-6b1e-11ed-8abf-dac502259ad0.png

69d3694a-6b1e-11ed-8abf-dac502259ad0.png

6a6bb498-6b1e-11ed-8abf-dac502259ad0.png

6a8efd18-6b1e-11ed-8abf-dac502259ad0.png

6aa52340-6b1e-11ed-8abf-dac502259ad0.png

6acf0e1c-6b1e-11ed-8abf-dac502259ad0.png

6b2ab64a-6b1e-11ed-8abf-dac502259ad0.png

6b47f3cc-6b1e-11ed-8abf-dac502259ad0.png

6b691b4c-6b1e-11ed-8abf-dac502259ad0.png

6b98fb3c-6b1e-11ed-8abf-dac502259ad0.png

6bb21158-6b1e-11ed-8abf-dac502259ad0.png

6bd4d6ca-6b1e-11ed-8abf-dac502259ad0.png

6bf73ef4-6b1e-11ed-8abf-dac502259ad0.png

6c138550-6b1e-11ed-8abf-dac502259ad0.png

6c5d1daa-6b1e-11ed-8abf-dac502259ad0.png

6c76cfb6-6b1e-11ed-8abf-dac502259ad0.png

6d10d5ca-6b1e-11ed-8abf-dac502259ad0.png


原文标题:JSON压缩算法解读

文章出处:【微信公众号:开源技术服务中心】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源技术
    +关注

    关注

    0

    文章

    389

    浏览量

    8687
  • OpenHarmony
    +关注

    关注

    31

    文章

    3926

    浏览量

    20715

原文标题:JSON压缩算法解读

文章出处:【微信号:开源技术服务中心,微信公众号:共熵服务中心】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解析淘宝拍立淘按图搜索API接口与JSON数据示例参考

    应用。 获取API权限和密钥(App Key、App Secret)。 使用Python调用API的示例代码。 3. JSON数据示例与解析 返回的JSON数据结构解析。 如何提取关键信息(如商品ID、名称、价格、图片等)。 4. 拍立淘API的应用场景 图像搜索与商品推
    的头像 发表于 11-11 13:19 116次阅读

    应用于暂态波形存储的数据压缩算法需要考虑哪些因素?

    应用于暂态波形存储的数据压缩算法,需围绕 暂态波形特性 (突变性、关键特征依赖性)、 工业场景需求 (实时性、硬件限制)及 数据应用价值 (故障溯源、合规性)综合考量,核心需关注以下六大维度: 一
    的头像 发表于 11-05 15:02 146次阅读

    HarmonyOSAI编程智能代码解读

    CodeGenie > Explain Code,开始解读当前代码内容。 说明 最多支持解读20000字符以内的代码片段。 使用该功能需先完成CodeGenie登录授权。 本文主要从参考引用自HarmonyOS官方文档
    发表于 09-02 16:29

    低内存场景下的高效压缩利器:FastLZ压缩库应用实践指南

    在资源受限环境中,数据压缩既要追求速度又要节省内存。本文聚焦FastLZ压缩库,深入探讨其在低内存场景下的应用实践,通过解析其核心算法与优化策略,带您掌握如何利用该库实现快速压缩,满足
    的头像 发表于 07-22 15:13 202次阅读
    低内存场景下的高效<b class='flag-5'>压缩</b>利器:FastLZ<b class='flag-5'>压缩</b>库应用实践指南

    HarmonyOS AI辅助编程工具(CodeGenie)代码智能解读

    。 选中.ets文件或者.cpp文件中需要被解释的代码行或代码片段,右键选择CodeGenie > Explain Code,开始解读当前代码内容。 说明 最多支持解读20000字符以内
    发表于 07-17 17:02

    迅为RK3568开发板基本工程目录-app.json5

    AppScope>app.json5 是应用的全局的配置文件,用于存放应用公共的配置信息。app.json5文件内容如下图所示: 第 3 行代码 bundleName 是包名 第 4
    发表于 07-14 10:56

    基于FPGA的压缩算法加速实现

    本设计中,计划实现对文件的压缩及解压,同时优化压缩中所涉及的信号处理和计算密集型功能,实现对其的加速处理。本设计的最终目标是证明在充分并行化的硬件体系结构 FPGA 上实现该算法时,可以大大提高该
    的头像 发表于 07-10 11:09 2076次阅读
    基于FPGA的<b class='flag-5'>压缩</b><b class='flag-5'>算法</b>加速实现

    harmony-utils之JSONUtil,JSON工具类

    harmony-utils之JSONUtil,JSON工具类 harmony-utils 简介与说明 harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类
    的头像 发表于 07-03 18:21 345次阅读

    SPI协议,寄存器解读

    最近在学习SPI协议,对寄存器操作不是特别熟练。发帖希望有大佬能从寄存器角度提供帮助,帮忙指导根据手册去解读协议。有偿。
    发表于 05-22 20:08

    不用联网不用编程,PLC通过智能网关快速实现HTTP协议JSON格式与MES等系统平台双向数据通讯

    智能网关IGT-DSER支持POST/GET/PUT等多种方法,可同时作为HTTP协议的客户端和服务端。作为客户端通讯时将JSON文件提交给HTTP的服务端, 如果服务端有返回的JSON,网关
    的头像 发表于 05-13 14:40 870次阅读
    不用联网不用编程,PLC通过智能网关快速实现HTTP协议<b class='flag-5'>JSON</b>格式与MES等系统平台双向数据通讯

    嵌入式系统中的代码优化与压缩技术

    在当今数字化时代,嵌入式系统广泛应用于各个领域,从智能家居设备到工业控制系统,从汽车电子到可穿戴设备,它们无处不在。而在嵌入式系统开发中,代码优化与压缩技术至关重要,直接影响着系统的性能、成本
    发表于 02-26 15:00

    EE-257:面向Blackfin处理器的引导压缩/解压缩算法

    电子发烧友网站提供《EE-257:面向Blackfin处理器的引导压缩/解压缩算法.pdf》资料免费下载
    发表于 01-07 13:56 0次下载
    EE-257:面向Blackfin处理器的引导<b class='flag-5'>压缩</b>/解<b class='flag-5'>压缩</b><b class='flag-5'>算法</b>

    think-cell——使用JSON数据实现自动化(二)

    26.4 远程提供模板 还可以通过远程服务器提供带有 think-cell 图表的模板文件。在这种情况下,键的值是 URL 而不是本地路径,如上面的远程 JSON 示例所示。URL 可以指定为协议
    的头像 发表于 01-03 10:12 631次阅读
    think-cell——使用<b class='flag-5'>JSON</b>数据实现自动化(二)

    think-cell——使用JSON数据实现自动化(一)

    您可以使用 JSON 中的数据来复制最初作为模板创建的图表,并为其提供新的数据表。您可以控制使用特定模板构建新演示文稿的顺序。模板也可以多次使用。 PowerPoint 模板和 JSON 数据都可以
    的头像 发表于 01-02 13:37 725次阅读
    think-cell——使用<b class='flag-5'>JSON</b>数据实现自动化(一)

    MOSFET参数解读

    SGT-MOSFET各项参数解读
    发表于 12-30 14:15 1次下载