一种JSON数据实时无损压缩以及解压方法与流程

文档序号:17069310发布日期:2019-03-08 23:10阅读:929来源:国知局
一种JSON数据实时无损压缩以及解压方法与流程
本发明涉及字典索引、排序算法以及数据存储、数据解压缩领域,具体而言是一种json数据实时无损压缩以及解压方法。
背景技术
:json(javascriptobjectnotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于javascriptprogramminglanguage,standardecma-2623rdedition-december1999的一个子集。json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得json成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,json目前已经普遍使用并且成为网络传输的主流数据格式。但是json本身定义之初的定位是一种易于阅读和编写的数据格式,json数据本身存在较大的压缩和优化空间,当传输的数据量过大的时候导致消耗的流量和带宽等网络资源也越加大。针对以上的问题,特别是在网络发达的今天,数据传输压缩愈加重要。目前存在一些开源json压缩算法,大部分是将json数据当成普通的字符串进行压缩处理,或者仅仅对重复的key或者value进行处理,这样虽然也能对json压缩处理,但是当json中属性太多,或者连续重复的字符过多时,压缩效果并不理想。技术实现要素:为了解决上述技术的缺陷,本发明技术方案吸取了现有开源算法的优点,同时针对json数据中属性太多,连续重复字符的情况,对现有算法进行的改进和优化,目的是为了提供一种压缩率更高、压缩速度更加快捷的json实时无损压缩以及解压方法。本发明的目的是通过以下技术方案来实现的:一种json数据实时无损压缩以及解压方法,该方法包含json数据压缩以及解压流程;所述压缩流程通过清洗组件清洗json数据格式中不影响数据确定性的字符,通过提取组件提取压缩字典,通过编码组件形成初步的压缩字符,最终通过合成组件完成整个json数据的压缩;所述解压流程通过拆解组件拆分字典以及压缩字符,通过解析组件解析压缩字符中的占位符信息和重复次数信息并对字典中的字符进行还原,最终通过还原组件还原清洗组件清除的字符信息,得到原json数据。进一步地,所述清洗组件清洗的不影响数据确定性的字符包括:清除json数据格式中属性的引号;清除json数据格式中非纯数字字符的引号,清除纯数字字符末尾的引号;清除布尔型数据,使用特定字符串代替。进一步地,所述提取组件根据清洗完成的数据格式,进行最大压缩率的相同字符串提取,并生成字典;再通过编码组件进行特定占位符替换,形成新的压缩字符串,如此往复最终完全压缩所有满足条件的相同字符串。进一步地,在提取最大压缩率的相同字符串过程中,将原字符串的所有长度大于2的字符子集取出(少于或等于2个无法满足压缩要求),并且按照子串长度从小到大排序;从前往后穷举子串集合,统计子串在原字符串中的出现次数,出现次数与子串长度相乘,得到该子串在本轮提取中的票数;例如出现“abc”字符串共10次,则“abc”得票数为30;所有子串票数统计完毕,票数最高的子串成为一个字典。进一步地,每次计票提取出一个最大压缩率的相同字符串时,均通过编码组件进行一次编码,编码的过程包括:替换原始字符串中的提取的相同字符串为特定占位符,并按照压缩率大小对相同字符串进行排序(压缩率越高排序越靠前)、分开存储。进一步地,所述特定占位符采用双引号加字母递增的形式,排序第一位的对应小写字母a,第二位对应小写字母b以此类推;第二十七位对应大写字母a,二十八位对应大写字母b,以此类推;超过五十二叠加一个字母,五十三位对应字母aa,以此类推。进一步地,所述合成组件包括:扫描编码完成后的压缩字符,检测重复且连续的占位符,并合成一个占位符,在占位符后方依次标记重复次数及引号,对于只出现一次的占位符直接添加引号;拼接压缩后的字符串以及字典,并且使用#连接;字典间按照压缩率由高到低排序,并使用单竖线连接(字典中的单引号、#号、单竖线均使用反斜杠进行转义)。进一步地,所述拆解组件将压缩字符串以及字典使用#号拆解,将字典字符串按照单竖线分割,保持原有顺序。进一步地,所述解析组件用于解析引号开头、字母占位符、数字重复次数(无重复则无数字标识)以及引号结尾的压缩数据。进一步地,所述还原组件还原清洗组件清除的字符,需要还原的信息包括:还原json数据格式中属性的引号;还原json数据格式中非纯数字字符的引号,还原纯数字字符末尾的引号;将特定字符串还原成布尔型数据。本发明的有益效果是:本发明方法通过清洗组件、提取组件、编码组件、合成组件对json数据包进行压缩,以生成新的压缩数据包。本发明方法通过拆解组件、解析组件、还原组件对压缩的数据包进行json数据格式无损还原。本发明方法有效提升json数据包的压缩率,json数据越大时,压缩率越高,压缩效果越好。附图说明图1是本发明的整体结构示意图;图2是本发明中对json数据的压缩工作流程图;图3是本发明中对json数据的解压工作流程图。具体实施方式以下结合附图和具体实施例对本发明作进一步详细说明。如图1所示,一种json数据实时无损压缩以及解压方法,本方法有清洗组件、提取组件、编码组件、合成组件、拆解组件、解析组件、还原组件。清洗组件会对原json数据中不影响数据确定性的字符进行清除,已达到部分压缩效果。提取组件对字符串中的相同字符串提取、记录,编码组件对提取的字典进行占位符替换,形成新的压缩字符串。合成组件对字典进行排序组合,最终将压缩字符串以及排序好的字典进行连接组合,形成能无损解压的压缩字符串。在拆解组件对压缩字符串进行拆解,提取出字典与需要还原的压缩字符串。解析组件将字典中的值解析进入压缩字符,还原组件还原由清洗组件清除的不影响确定性的字符,最终无损的解压出原json数据。如图2所示:本方法在压缩json数据工作过程中通过清洗组件、提取组件、编码组件、合成组件得到压缩的字符串,其具体步骤如下:步骤一:如s11所示,在准备发送json数据之前,首先经过清洗组件对无用数据进行清洗。首先清除json数据格式中属性的引号,清除json数据格式中非纯数字字符的引号、纯数字字符清除末尾的引号,清除布尔型数据、使用特定字符串代替(1"代表true,0"代表false),此时对json数据进行第一步的压缩。步骤二:如s12所示,提取组件根据清洗完成的数据格式,进行最大压缩率的相同字符串提取。在提取最大压缩率的相同字符串过程中,按照字符的长度、出现次数进行计票,压缩一个字符计一票,一个相同字符串的总票数等于字符长度乘以出现次数,票数最高的字符成为一个字典。字符长度至少超过2个,少于或等于2个无法满足压缩要求,不能成为一个字典。步骤三:如s13所示,每找出一个字典,编码组件即可使用占位符替换原始字符中的字典字符串成为特定的占位符(双引号加字母递增)。重复步骤二、步骤三,直至无满足条件的字符。字母占位符定义规则如下:排序第一位的对应小写字母a,第二位对应小写字母b以此类推;第二十七位对应大写字母a,二十八位对应大写字母b,以此类推;超过五十二叠加一个字母,五十三位对应字母aa,以此类推。步骤四:如s14所示,合成组件组合字典排序按照压缩率越高的字典排在前面,字典与字典之间使用“|”单竖线进行连接,字典中的单引号、#号、单竖线均使用反斜杠(“\”)进行转义。并且合成组件会检测压缩字符中重复且连续的占位符,并合成一个占位符,在占位符后方增加数字以及引号进行标记。对于只出现一次的占位符直接添加引号。最终合成组件使用“#”号连接压缩字符以及字典,形成新的压缩字符。如图3所示:本发明方法通过拆解组件、解析组件、还原组件对压缩的数据包进行json数据格式无损还原,其具体步骤如下:步骤一:如s21所示,拆解组件将压缩字符串以及字典使用“#”号拆解,得到加密字符串与字典,并且将字典字符串按照单竖线(“|”)分割,保持原有顺序。因为还原过程中是根据字典顺序进行字符还原的,所以必须保证字典保持原有的顺序,否则无法做到无损还原。步骤二:如s22所示,解析组件首先检测压缩字符串中带有引号开头,第二位是字母,并且引号结尾的字符。按照压缩时a、b、c以此类推的顺序,进行替换字典,并且找到引号结尾前的数字,按照数字标记的次数进行重复替换,结尾符号前无数字则只需要替换一次。步骤三:如s23所示,还原组件进行还原json数据格式中属性的引号;还原json数据格式中非纯数字字符的引号,纯数字字符还原末尾的引号;还原布尔型数据,特定字符串还原布尔型数据。还原清除组件清除的不影响确定性的字符,最终无损的解压原json数据。以下以一个具体实例详细说明本发明的实现过程:原json字符串如下:{"student":[{"name":"tom","grade":1,"age":11,"gender":"m","no":"100010","pass":true},{"name":"jerry","grade":1,"age":10,"gender":"m","no":"100011","pass":true},{"name":"jane","grade":1,"age":9,"gender":"f","no":"100012","pass":false}],"classroom":{"class1":"roomroom1","class2":"room2"}}压缩流程如下:一、清洗组件:1-1.清除属性的引号{student:[{name:"tom",grade:1,age:11,gender:"m",no:"100010",pass:true},{name:"jerry",grade:1,age:10,gender:"m",no:"100011",pass:true},{name:"jane",grade:1,age:9,gender:"f",no:"100012",pass:true}],classroom:{class1:"roomroom1",class2:"room2"}}1-2.清除非全数字字符串的引号,纯数字使用单个引号特殊标记{student:[{name:tom,grade:1,age:11,gender:m,no:"100010,pass:true},{name:jerry,grade:1,age:10,gender:m,no:"100011,pass:true},{name:jane,grade:1,age:9,gender:f,no:"100012,pass:false}],classroom:{class1:roomroom1,class2:room2}}1-3.boolean型使用特殊标记符true=1",false=0"{student:[{name:tom,grade:1,age:11,gender:m,no:"100010,pass:1"},{name:jerry,grade:1,age:10,gender:m,no:"100011,pass:1"},{name:jane,grade:1,age:9,gender:f,no:"100012,pass:0"}],classroom:{class1:roomroom1,class2:room2}}二、提取组件以及编码组件2-1获取字符串的所有长度大于2,出现次数大于1的子集提取相同字符串字符出现次数总票数na36nam39name312name:315name:j212……..…………grade:1,age:336grade:1,age:1226gender:321no:"10001327pass:315class315room312找到票数最高的子串:“grade:1,age:”作为一个字典。2-2使用占位符替换原json字符串中子串编码后的字符串:{student:[{name:tom,"a11,gender:m,no:"100010,pass:1"},{name:jerry,"a10,gender:m,no:"100011,pass:1"},{name:jane,"a9,gender:f,no:"100012,pass:0"}],classroom:{class1:room1,class2:room2}}字典:grade:1,age:重复执行2-1以及2-2步骤直到无重复字符,得到初步压缩字符,以及字典:初步压缩字符:{student:[{"ftom,"a11,"cm,"b0,"d1"},{"fjerry,"a10,"cm,"b1,"d1"},{"fjane,"a9,"cf,"b2,"d0"}],"e"g:{"e1:"g"g1,"e2:"g2}}字典列表:1.grade:1,age:2.no:"100013.gender:4.pass:5.class6.name:7.room三、合成组件检测连续重复的占位符,标记重复次数,并完成占位符合成。{student:[{"f"tom,"a"11,"c"m,"b"0,"d"1"},{"f"jerry,"a"10,"c"m,"b"1,"d"1"},{"f"jane,"a"9,"c"f,"b"2,"d"0"}],"e""g":{"e"1:"g2"1,"e"2:"g"2}}拼接字典,得到最终的压缩字符:{student:[{"f"tom,"a"11,"c"m,"b"0,"d"1"},{"f"jerry,"a"10,"c"m,"b"1,"d"1"},{"f"jane,"a"9,"c"f,"b"2,"d"0"}],"e""g":{"e"1:"g2"1,"e"2:"g"2}}#grade:1,age:|no:"10001|gender:|pass:|class|name:|room解压流程如下:一、拆解组件按照“#”号拆解得到初步压缩字符串以及字典:压缩字符:{student:[{"f"tom,"a"11,"c"m,"b"0,"d"1"},{"f"jerry,"a"10,"c"m,"b"1,"d"1"},{"f"jane,"a"9,"c"f,"b"2,"d"0"}],"e""g":{"e"1:"g2"1,"e"2:"g"2}}字典字符:grade:1,age:|no:"10001|gender:|pass:|class|name:|room按照“|”拆解得到字典列表字典列表:1.grade:1,age:2.no:"100013.gender:4.pass:5.class6.name:7.room二、解析组件解析占位符,以及重复次数,并替换字典:{student:[{name:tom,grade:1,age:11,gender:m,no:"100010,pass:1"},{name:jerry,grade:1,age:10,gender:m,no:"100011,pass:1"},{name:jane,grade:1,age:9,gender:f,no:"100012,pass:0"}],classroom:{class1:roomroom1,class2:room2}}三、还原组件3-1.还原boolean属性:{student:[{name:tom,grade:1,age:11,gender:m,no:"100010,pass:true},{name:jerry,grade:1,age:10,gender:m,no:"100011,pass:true},{name:jane,grade:1,age:9,gender:f,no:"100012,pass:false}],classroom:{class1:roomroom1,class2:room2}}3-2.补全非全数字字符串的引号,补全纯数字末尾的引号:{student:[{name:"tom",grade:1,age:11,gender:"m",no:"100010",pass:true},{name:"jerry",grade:1,age:10,gender:"m",no:"100011",pass:true},{name:"jane",grade:1,age:9,gender:"f",no:"100012",pass:true}],classroom:{class1:"roomroom1",class2:"room2"}}3-3.还原属性的引号,得到原json字符:{student:[{name:"tom",grade:1,age:11,gender:"m",no:"100010",pass:true},{name:"jerry",grade:1,age:10,gender:"m",no:"100011",pass:true},{name:"jane",grade:1,age:9,gender:"f",no:"100012",pass:true}],classroom:{class1:"roomroom1",class2:"room2"}}以上所述,仅仅是本发明的技术设计方案,并非对本发明作任何形式上的限制,熟悉本专业的技术人员,在不脱离本发明原理的情况下,可以做出若干改进和修饰润色,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何的简单修改、等同变化与修饰,仍属于本发明技术方案的范围内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1