最近做了个移动web应用,java平台做后台,后台查询的数据结果用json格式传输,其中有个页面,后台返回的数据量很大,json字符串达到了68K,这对于移动设备的流量和响应速度来说,绝对是个悲剧。
1,未处理前的数据格式为:
{[{"consDept":"A部门","consDeptCode":"001","provinceScheduleVO":[{"projectTypeCode":"DEngineering","percentSchedule":"100","planStartStatus":"2"},{"projectTypeCode":"Main","percentSchedule":"50","planStartStatus":"2"}, ……]},
{"consDept":"B部门","consDeptCode":"002","provinceScheduleVO":[{"projectTypeCode":"DEngineering","percentSchedule":"100","planStartStatus":"1"},{"projectTypeCode":"Main","percentSchedule":"0","planStartStatus":"1"}, ……]}, …… ]};
字符串大小为68K.
2,很明显,字符串越长,体积越大,因为是数组形式,相同的属性名称会重复很多次,通过减短属性名称,应该能降低不少体积。
比如,把consDept属性名改成a,consDeptCode属性名改成b,把projectTypeCode属性名称改成c, …… 切记不要传输前台不需要的属性。
处理后的数据格式为:
{[{"a":"A部门","b":"001","VO":[{"c":"DEngineering","d":"100","e":"2"},{"c":"Main","d":"50","e":"2"}, ……]},
{"a":"B部门","b":"002","VO":[{"c":"DEngineering","d":"100","e":"1"},{"c":"Main","d":"0","e":"1"}, ……]}, …… ]};
字符串大小变成了25K,效果很明显。
对于这种数组形式,如果数据格式相对比较简单,没有嵌套的一维数组,甚至可以改成键值对的形式, 比如 “a”:["A部门","B部门","C部门"] ,以减少“a”属性名称出现的次数。
3,对结果再采用压缩算法来压缩,(此处演示用ZIP或GZIP压缩)
ZIP压缩,除了压缩外,还会归档成一个文件
GZIP压缩,则只能压缩。本应用无需归档,所以,此处采用GZIP方式压缩字符串。
运用jdk自带的java.util.zip.GZIPInputStream,java.util.zip.GZIPOutputStream 即可完成压缩。
处理后的数据格式为:
"{?x5cu0001°T?U?????5x5cu003ex5cu0010?(x5crx5cu0002Ql?x5cu0018x5cu0013x5cu0014±x5cu0015x5cu000bH??x5cu0016x5c"b??? ?x5c"_A?x5cu0019v???èx5cu001e??×??I?2Op?ss???????x5cu000
2??????[?x5cu001bY~x5cu001f?_y?yn?x5crx5cu0027??B7?x5cnm?is6x5cu000eU?èüH}ì7;úVá*?x5cu0013Q??x5cu0012re??Wx5cu0016?x5cu000f??x5cu0015?àx5cu0013?|8Bm??-J7q?V?]x5cu0013ux5cx5cx5cu003dA???x5cu001frB??x5cu000f????x5cu0005?x5cu0016?x5cu0012|T?N??x5cu0012?p????x5cu0004Ué[??^?·x5cu003c???9T?x5cu001aux5cn?eE???_x5cu001fJ?O}……
字符串大小变成了1.4K,节省了不少空间。
附上GZIP压缩java代码:
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; ...阅读原文