我从一个移动应用程序提交相对大量的数据(高达1000个JSON对象),我通常会编码是这样的:
[{
id: 12,
score: 34,
interval: 5678,
sub: 9012
}, {
id: ...
}, ...]
我可以使有效载荷通过提交一个数组的数组,而不是更小:
[[12, 34, 5678, 9012], [...], ...]
以节省一些空间上的属性名称,并重新创建的对象在服务器上(作为模式是固定的,或者至少它是服务器和客户端之间的合同)。
有效载荷在随后提交的POST
请求,最有可能通过3G连接(或者可能是WIFI)。
它看起来像我使用嵌套数组节约一些带宽,但是我不知道应用的gzip当值得注意的是,我不知道如何准确,客观地衡量的差异。
在另一方面,嵌套的数组不觉得自己是个好主意:他们不太容易阅读,因而更难调试时发现错误。 此外,由于我们正在冲洗可读性下来上厕所,我们只能扁平化阵列,因为每个孩子数组元素的一个固定数量,服务器可以只切了起来,再次重建的对象。
关于这个主题的进一步阅读材料是非常赞赏。
JSONH,又名hpack, https://github.com/WebReflection/JSONH确实非常相似,你的榜样的东西:
[{
id: 12,
score: 34,
interval: 5678,
sub: 9012
}, {
id: 98,
score: 76,
interval: 5432,
sub: 1098
}, ...]
会变成:
[["id","score","interval","sub"],12,34,5678,9012,98,76,5432,1098,...]
JSON是为可读性。 如果你很在意空间,你可以有一个中间格式。 创建一个序列化/反序列化功能,这需要一个JSON文件,并创建一个压缩的二进制存储你的数据尽量紧凑合理,然后读上线的另一端该格式。
请参阅: http://en.wikipedia.org/wiki/Json第一句:“JSON ...是一个轻量级的基于文本的开放标准设计为人类可读的数据交换。”
从本质上讲,我的观点是,人类总是会看到JSON和机器将主要看到的二进制文件。 你得到两全其美的:可读性和小数据传输(在计算的少量费用)。
gzip的将自己的第一次出现的小的反向引用替换邮件的重复部分。 该算法是非常“愚蠢”,但对这种重复数据的是伟大的。 我想你不会看到明显的跌幅超过了线的大小,因为你的对象“结构”只发送一次。
你可以拉上两个采样JSONs大致进行测试。 或通过捕获使用招的HTTP请求。 它可以显示压缩和非压缩的大小。
由于您使用该移动设备(你提到3G)上,你可能真的想关心的大小,没有可读性。 此外,你经常希望读什么是网络线路上的传播?
这是另一种形式的建议。
protobuf的是一种选择。 谷歌使用它在内部,并且有一个的Protobuf'编译器可以读.proto
文件(包含消息描述)和生成Java / C ++ / Python的串行器/解串器,其通过线路使用二进制形式以用于传输。 您只需使用两端生成的类,而忘记了什么物体看起来比时导线传输等。 此外,还有一个外部维护的OBJ-C端口 。
下面是一个比较的Protobuf对XML的protobuf的网站上(我知道XML是不是你用什么,仍然)。
最后,这里是一个Python的教程 。
虽然是一个老问题,我想放些话。
根据我的经验,在生JSON大小,数量压缩后很少大的差异。 我宁愿保持它的人类可读。
在实际情况下的数字:1,29MB的JSON文件,以及145KB的优化版本,压缩时,其中32KB和9KB的。
除非在极端条件下,我认为这种差异是negligibles和可读性的成本是巨大的。
A:
{
"Code": "FCEB97B6",
"Date": "\/Date(1437706800000)\/",
"TotalQuantity": 1,
"Items": [
{
"CapsulesQuantity": 0,
"Quantity": 1,
"CurrentItem": {
"ItemId": "SHIELD_AXA",
"Order": 30,
"GroupId": "G_MODS",
"TypeId": "T_SHIELDS",
"Level": 0,
"Rarity": "R4",
"UniqueId": null,
"Name": "AXA Shield"
}
}
],
"FormattedDate": "2015-Jul.-24"
}
B:
{
"fDate": "2016-Mar.-01",
"totCaps": 9,
"totIts": 14,
"rDays": 1,
"avg": "1,56",
"cells": {
"00": {
"30": 1
},
"03": {
"30": 1
},
"08": {
"25": 1
},
"09": {
"26": 3
},
"12": {
"39": 1
},
"14": {
"33": 1
},
"17": {
"40": 3
},
"19": {
"41": 2
},
"20": {
"41": 1
}
}
}
这是两个文件的片段。