JSON压缩方案

JSON

关于JSON,大家耳熟能详,不做多说,今天在这里分享一下关于JSON压缩的几点方案。

1.压缩Key

原始JSON(长度:79)

1
2
3
4
5
6
7
{
"username": "张三",
"gender": "M",
"age": 38,
"email": "a@b.com",
"phone": "15818376578"
}

压缩Key以后(长度:57)

1
2
3
4
5
6
7
{
"a": "张三",
"b": "M",
"c": 38,
"d": "a@b.com",
"e": "15818376578"
}

体积减小27.85%,对于高并发的服务而言,此数字相当可观!!!
那么,是不是所有的Restful都可以采用这种方案来进行压缩呢?答案是否定的。首先,Key压缩损失了JSON的可读性,这就要求必须事先进行约定,增加了出错的风险;其次,对于JSON中含有较长Value字段的,压缩效果不是很明显,可能得不偿失。
附:如果采用Jackson,那么对username的压缩实现为@JsonProperty(“a”)

2.省略Key

如果说方案1不解渴,那就来个更彻底的,直接省略掉Key!!!

原始JSON(长度:79)

1
2
3
4
5
6
7
{
"username": "张三",
"gender": "M",
"age": 38,
"email": "a@b.com",
"phone": "15818376578"
}

省略Key以后(长度:37)

1
2
3
4
5
6
7
[
"张三",
"M",
38,
"a@b.com",
"15818376578"
]

体积减小53.16%,Oh,mygod!!!
当然缺点就是将对象转换成了数组,这就要求字段顺序必须有保证(这个不难,排序一下就好),并且对于0或者null字段也不可省略。

3.字典压缩

改进版的方案1,即:预先分析所有的字段,然后对字段名称进行编码(缩写),得到编码字典,之后的JSON生成和解析依赖于该字典,这样就可以进行高效的“压缩”和“解压”。此过程无需改动(侵入)现有代码,实现时,仅需对输入和输出进行过滤。

以上几种方案都是针对客户端为浏览器的情况下进行的改造,兼容性强,改动量都不是很大,却可以获得不错的性能提升。如果是服务与服务之间的通信,则完全可以替换掉JSON,比如Goole的Protobuf。