文章轉(zhuǎn)發(fā)自51CTO 開源基礎(chǔ)軟件社區(qū) OpenHarmony成長(zhǎng)計(jì)劃啃論文俱樂(lè)部【FFH】啃論文俱樂(lè)部---JSON壓縮算法解讀
1.關(guān)于作者
大家好!我是來(lái)自深圳技術(shù)大學(xué)FSR Lab(編者注:Falcon Swarm Robotics Lab獵鷹集群機(jī)器人控制實(shí)驗(yàn)室的縮寫)的同學(xué),標(biāo)題FFH就是FSRlab For Harmony!并且我也正在參加OpenHarmony成長(zhǎng)計(jì)劃從論文到開源提交研究,以后我們也會(huì)陸續(xù)在這個(gè)社區(qū)記錄學(xué)習(xí)心得和體會(huì)。
在OpenHarmony成長(zhǎng)計(jì)劃啃論文俱樂(lè)部里,F(xiàn)FH小組同學(xué)們與華為、軟通動(dòng)力、潤(rùn)和軟件、拓維信息、深開鴻等公司一起,學(xué)習(xí)和研究序列化相關(guān)技術(shù)…
2. 為什么需要壓縮JSON?
盡管JSON數(shù)據(jù)格式比XML效率要高,但是它仍然是web服務(wù)器和瀏覽器傳輸過(guò)程中比較低效的數(shù)據(jù)格式。為什么呢?
-
首先,它將所有的內(nèi)容都轉(zhuǎn)換為了文本。
-
第二是轉(zhuǎn)換之后的文本過(guò)度使用引號(hào),這樣會(huì)給每個(gè)字符串添加多兩個(gè)字節(jié)。
-
第三,它本身沒(méi)有schema的標(biāo)準(zhǔn)格式,比如在一個(gè)消息中序列化多個(gè)對(duì)象的時(shí)候,即使每個(gè)對(duì)象的屬性的鍵名是重復(fù)且相同的,但是轉(zhuǎn)換后的文本數(shù)據(jù)還是會(huì)重復(fù)每一個(gè)鍵名。
JSON以前的時(shí)候有一個(gè)優(yōu)勢(shì),就是可以被Javascript引擎直接解析,但因?yàn)楝F(xiàn)在越來(lái)越重視安全性,JSON的這個(gè)優(yōu)勢(shì)也逐漸消失了,但是因?yàn)樗萖ML效率以及性能都更高,所以許多傳統(tǒng)的C/S模式都是選擇JSON,比如web服務(wù)。當(dāng)有龐大的數(shù)據(jù)量以及復(fù)雜數(shù)據(jù)結(jié)構(gòu)需要從web瀏覽器中傳輸?shù)椒?wù)器的時(shí)候,JSON壓縮就起到了非常大的作用,然而中間就會(huì)存在我們剛剛說(shuō)的三點(diǎn)問(wèn)題,我們也不能使用傳統(tǒng)的gzip壓縮算法,因?yàn)闉g覽器不知道服務(wù)器是否支持gzip解壓。
下面我們就來(lái)看看兩種常見(jiàn)的JSON壓縮算法,cJSON與HPack。
3. cJSON壓縮算法
cJSON壓縮算法(cJSON Compression Algorithm)的特點(diǎn)就是可以使用自動(dòng)類型提取壓縮JSON數(shù)據(jù)格式的內(nèi)容。它成功解決了一個(gè)非常重要的問(wèn)題,就是我們上一小節(jié)提到的第三點(diǎn),將不斷重復(fù)的鍵名舍去了,我們我們來(lái)看一個(gè)例子:
使用cJSON前的數(shù)據(jù)格式:
[
{ //表示一個(gè)坐標(biāo)點(diǎn)
"x":100,
"y":100
},
{ //表示一個(gè)長(zhǎng)方形
"x":100,
"y":100,
"width":200,
"height":150
},
{},//表示一個(gè)空對(duì)象
... //以下省略數(shù)以萬(wàn)計(jì)的對(duì)象
]
上面未經(jīng)壓縮的數(shù)據(jù)中,我們可以看到有非常多的空間被重復(fù)的鍵名所占據(jù),比如“x”,“y”等等,當(dāng)數(shù)據(jù)非常多的時(shí)候,這些看起來(lái)不起眼的重復(fù)鍵名會(huì)給傳輸效率帶來(lái)非常大的影響,其實(shí)解決思路也非常簡(jiǎn)單,因?yàn)樗麄兪侵貜?fù)的,那我們只存儲(chǔ)一次不就好了?下面我們來(lái)按照我們的思路看看cJSON處理過(guò)后的數(shù)據(jù)吧。
{
"templates":[
[//type1
], [//type2
] ],
"value":[
{ //第一個(gè)對(duì)象:坐標(biāo)點(diǎn)
"type":1,
"values":[
100,
100
]
},
{ //第二個(gè)對(duì)象:矩形
"type":2,
"values":[
100,
100,
200,
150
]
},
{
//第三個(gè)空對(duì)象
},
//以下省略數(shù)以萬(wàn)計(jì)的對(duì)象......
]
}
從上面的數(shù)據(jù)中我們可以看到,我們格式化了數(shù)據(jù),把鍵名存儲(chǔ)了起來(lái),重復(fù)的就不存儲(chǔ),然后值通過(guò)“type”索引來(lái)對(duì)應(yīng)鍵名,這樣在數(shù)據(jù)量龐大的時(shí)候確實(shí)減少了不少空間,但是我們仔細(xì)看“templates”內(nèi)的鍵名依舊有重復(fù)的字段存在。說(shuō)明了我們還存在優(yōu)化空間,優(yōu)化完壓縮后效果如下:
{ "function": "cjson",
"templates": [
[0, "x", "y"],
[1, "width", "height"]
],
"values": [
[1, 100, 100 ], //第一個(gè)對(duì)象:坐標(biāo)點(diǎn)
[2, 100, 100, 200, 150 ], //第二個(gè)對(duì)象:矩形
[] //第三個(gè)空對(duì)象
]
}
直接看壓縮后的代碼結(jié)構(gòu)你可能不太能理解,那我們就來(lái)看看他的具體原理,為了解決“template”內(nèi)鍵名重復(fù)的字段,這個(gè)算法采用了樹這個(gè)數(shù)據(jù)結(jié)構(gòu),每遇到一個(gè)要傳輸?shù)膶?duì)象,就按順序把鍵值存入樹的節(jié)點(diǎn)中(灰色的節(jié)點(diǎn)是被標(biāo)記的結(jié)尾節(jié)點(diǎn)指針,表示該節(jié)點(diǎn)存儲(chǔ)的是某個(gè)對(duì)象最后一個(gè)屬性的鍵值),重復(fù)的就不存儲(chǔ),這樣就解決了我們的問(wèn)題,這個(gè)鍵值樹的變化過(guò)程如下:
最后數(shù)據(jù)在匹配鍵值的時(shí)候就根據(jù) “values” 中所標(biāo)記的結(jié)尾節(jié)點(diǎn)指針找到對(duì)應(yīng)鍵值數(shù)組,這樣就構(gòu)成了cJSON的壓縮算法。
仔細(xì)的同學(xué)就會(huì)發(fā)現(xiàn),如果一個(gè)對(duì)象中沒(méi)有"X"和"Y",只有“width”和“height”,或者鍵值節(jié)點(diǎn)順序是錯(cuò)的,是不是會(huì)出問(wèn)題?答案是對(duì)的,會(huì)出現(xiàn)無(wú)法匹配的鍵值的情況,所以這種方法只能在特定的場(chǎng)景下應(yīng)用,存在一定局限性。
總體來(lái)說(shuō),cJSON在處理非常龐大的數(shù)據(jù)量的時(shí)候效果還是非??陀^的。
4.JSON.HPack壓縮算法
JSON.HPack壓縮算法(HPack Compression Algorithm)是一種無(wú)損、跨語(yǔ)言、注重性能的JSON數(shù)據(jù)壓縮算法,可以讓我們?cè)谑褂胮ost請(qǐng)求在客戶端發(fā)送數(shù)據(jù)到服務(wù)器的過(guò)程中相對(duì)普通JSON格式節(jié)省約70%的字符。
其原理本質(zhì)上也是跟cJSON一樣將鍵值抽離開,舉個(gè)例子:
使用HPack算法前:
{
"id" : 1,
"sex" : "Female",
"age" : 38,
"classOfWorker" : "Private",
"maritalStatus" : "Married-civilian spouse present",
"education" : "1st 2nd 3rd or 4th grade",
"race" : "White"
}
使用HPack算法后:
[
],[ ]
可以看到相對(duì)于普通JSON以及cJSON少了很多字符,比如引號(hào),各種括號(hào)等等,這種壓縮算法在數(shù)據(jù)量龐大的情況下效果也非常可觀。
HPack算法提供了幾個(gè)級(jí)別的壓縮(從0到4)。等級(jí)越高壓縮效率越高,每提升一個(gè)等級(jí)都有引入附加功能。0級(jí)壓縮通過(guò)從結(jié)構(gòu)中分離鍵值來(lái)執(zhí)行最基本的壓縮,并在索引0的元素上創(chuàng)建鍵名數(shù)組,下一個(gè)等級(jí)就可以通過(guò)假設(shè)存在重復(fù)條目來(lái)進(jìn)一步減小JSON數(shù)據(jù)的大小。
5.性能分析
接下來(lái)我們直接用數(shù)據(jù)來(lái)看看這幾個(gè)壓縮算法的壓縮效率,我們分別用5組大小不同的JSON文件(50KB~1MB),每個(gè)JSON文件將使用servlet容器(tomcat)提供給瀏覽器,并分別用以下算法進(jìn)行壓縮:
-
Original JSON size - 未作修改的JSON數(shù)據(jù)
-
Minimized - 刪除空白和新行(最基本的js優(yōu)化)
-
Compresse cJSON - 使用CJSON壓縮算法進(jìn)行JSON壓縮
-
Compresse HPack - 使用JSON.HPack壓縮算法進(jìn)行JSON壓縮
-
Gzipped - 使用gzip和進(jìn)行JSON壓縮
-
Gzipped + Minimized - 使用gzip和刪除空白和新行(最基本的js優(yōu)化)進(jìn)行JSON壓縮
-
Gzipped + Compresse cJSON - 使用gzip和CJSON壓縮算法進(jìn)行JSON壓縮
-
Gzipped + Compresse HPack - 使用gzip和JSON.HPack壓縮算法進(jìn)行JSON壓縮
下表(TABLE I.RESULTES)是用以上各種方式處理完后的JSON數(shù)據(jù)大小(bytes),不同列表示不同的JSON數(shù)據(jù)集,不同行表示使用不同的壓縮方式。
下面第一個(gè)圖表Y軸表示JSON數(shù)據(jù)大小(bytes):
第二張圖Y軸是JSON數(shù)據(jù)大小的百分比(%),原始數(shù)據(jù)為100%:
從上面的幾個(gè)圖表中我們可以直觀地看到,單獨(dú)使用cJSON可以把原始數(shù)據(jù)大小壓縮到45%左右,單獨(dú)使用HPack可以把原始數(shù)據(jù)大小壓縮到8%左右,可見(jiàn)整體上HPack是優(yōu)于cJSON的。
然而我們可以看到當(dāng)使用gzip和上面提到的兩個(gè)壓縮算法相結(jié)合進(jìn)行JSON壓縮,效果才是最優(yōu)的,基本可以達(dá)到1%~2%的壓縮率。
總的來(lái)說(shuō),HPack比cJSON效率更高,速度也更快,但是在使用壓縮算法進(jìn)行傳輸?shù)倪^(guò)程中,接收的一端需要進(jìn)行相應(yīng)的解壓縮操作,否則無(wú)法使用被壓縮過(guò)后的JSON數(shù)據(jù),這一步也會(huì)存在一定的性能開銷,在我們選擇使用JSON壓縮的時(shí)候,也需要考慮到這一點(diǎn)。當(dāng)可以使用gzip進(jìn)行壓縮的時(shí)候,這種方法比其他壓縮算法的效率都高,當(dāng)兩者同時(shí)結(jié)合起來(lái),效果顯而易見(jiàn)。
好了,我們這一次完整地了解了JSON序列化的發(fā)展,規(guī)范,應(yīng)用以及相關(guān)的壓縮算法,相信大家不僅對(duì)JSON壓縮算法有了更深的了解,也對(duì)JSON序列化這個(gè)技術(shù)領(lǐng)域有了深刻的認(rèn)識(shí)。
6.參考文獻(xiàn)
JSON Compression Algorithmshttp://repository.utm.md/bitstream/handle/5014/6418/ICMCS_2011_1_pg_244_247.pdf?sequence=1<本文完>
寫在最后
OpenHarmony 成長(zhǎng)計(jì)劃—“啃論文俱樂(lè)部”(以下簡(jiǎn)稱“啃論文俱樂(lè)部”)是在 2022年 1 月 11 日的一次日?;顒?dòng)中誕生的。截至 3 月 31 日,啃論文俱樂(lè)部已有 87 名師生和企業(yè)導(dǎo)師參與,目前共有十二個(gè)技術(shù)方向并行探索,每個(gè)方向都有專業(yè)的技術(shù)老師帶領(lǐng)同學(xué)們通過(guò)啃綜述論文制定技術(shù)地圖,按“降龍十八掌”的學(xué)習(xí)方法編排技術(shù)開發(fā)內(nèi)容,并通過(guò)專業(yè)推廣培養(yǎng)高校開發(fā)者成為軟件技術(shù)學(xué)術(shù)級(jí)人才。
啃論文俱樂(lè)部的宗旨是希望同學(xué)們?cè)陂_源活動(dòng)中得到軟件技術(shù)能力提升、得到技術(shù)寫作能力提升、得到講解技術(shù)能力提升。大學(xué)一年級(jí)新生〇門檻參與,已有俱樂(lè)部來(lái)自多所高校的大一同學(xué)寫出高居榜首的技術(shù)文章。
如今,搜索“啃論文”,人們不禁想到、而且看到的都是我們——OpenHarmony 成長(zhǎng)計(jì)劃—“啃論文俱樂(lè)部”的產(chǎn)出。
OpenHarmony開源與開發(fā)者成長(zhǎng)計(jì)劃—“啃論文俱樂(lè)部”學(xué)習(xí)資料合集
1)入門資料:啃論文可以有怎樣的體驗(yàn)
https://docs.qq.com/slide/DY0RXWElBTVlHaXhi?u=4e311e072cbf4f93968e09c44294987d
2)操作辦法:怎么從啃論文到開源提交以及深度技術(shù)文章輸出https://docs.qq.com/slide/DY05kbGtsYVFmcUhU
3)企業(yè)/學(xué)校/老師/學(xué)生為什么要參與 & 啃論文俱樂(lè)部的運(yùn)營(yíng)辦法https://docs.qq.com/slide/DY2JkS2ZEb2FWckhq
4)往期啃論文俱樂(lè)部同學(xué)分享會(huì)精彩回顧:
同學(xué)分享會(huì)No1.成長(zhǎng)計(jì)劃啃論文分享會(huì)紀(jì)要(2022/02/18)https://docs.qq.com/doc/DY2RZZmVNU2hTQlFY
同學(xué)分享會(huì)No.2 成長(zhǎng)計(jì)劃啃論文分享會(huì)紀(jì)要(2022/03/11)https://docs.qq.com/doc/DUkJ5c2NRd2FRZkhF
同學(xué)們分享會(huì)No.3 成長(zhǎng)計(jì)劃啃論文分享會(huì)紀(jì)要(2022/03/25)
https://docs.qq.com/doc/DUm5pUEF3ck1VcG92?u=4e311e072cbf4f93968e09c44294987d
現(xiàn)在,你是不是也熱血沸騰,摩拳擦掌地準(zhǔn)備加入這個(gè)俱樂(lè)部呢?當(dāng)然歡迎啦!啃論文俱樂(lè)部向任何對(duì)開源技術(shù)感興趣的大學(xué)生開發(fā)者敞開大門。
掃碼添加 OpenHarmony 高校小助手,加入“啃論文俱樂(lè)部”微信群
后續(xù),我們會(huì)在服務(wù)中心公眾號(hào)陸續(xù)分享一些 OpenHarmony 開源與開發(fā)者成長(zhǎng)計(jì)劃—“啃論文俱樂(lè)部”學(xué)習(xí)心得體會(huì)和總結(jié)資料。記得呼朋引伴來(lái)看哦。
原文標(biāo)題:JSON壓縮算法解讀
文章出處:【微信公眾號(hào):開源技術(shù)服務(wù)中心】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
開源技術(shù)
+關(guān)注
關(guān)注
0文章
389瀏覽量
7981 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3744瀏覽量
16502
原文標(biāo)題:JSON壓縮算法解讀
文章出處:【微信號(hào):開源技術(shù)服務(wù)中心,微信公眾號(hào):共熵服務(wù)中心】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論