是否值得尝试减少JSON尺寸的努力?(Is it worth the effort to try t

2019-06-25 17:13发布

我从一个移动应用程序提交相对大量的数据(高达1000个JSON对象),我通常会编码是这样的:

[{
    id: 12,
    score: 34,
    interval: 5678,
    sub: 9012
}, {
    id: ...
}, ...]

我可以使有效载荷通过提交一个数组的数组,而不是更小:

[[12, 34, 5678, 9012], [...], ...]

以节省一些空间上的属性名称,并重新创建的对象在服务器上(作为模式是固定的,或者至少它是服务器和客户端之间的合同)。

有效载荷在随后提交的POST请求,最有可能通过3G连接(或者可能是WIFI)。

它看起来像我使用嵌套数组节约一些带宽,但是我不知道应用的gzip当值得注意的是,我不知道如何准确,客观地衡量的差异。

在另一方面,嵌套的数组不觉得自己是个好主意:他们不太容易阅读,因而更难调试时发现错误。 此外,由于我们正在冲洗可读性下来上厕所,我们只能扁平化阵列,因为每个孩子数组元素的一个固定数量,服务器可以只切了起来,再次重建的对象。

关于这个主题的进一步阅读材料是非常赞赏。

Answer 1:

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,...]


Answer 2:

JSON是为可读性。 如果你很在意空间,你可以有一个中间格式。 创建一个序列化/反序列化功能,这需要一个JSON文件,并创建一个压缩的二进制存储你的数据尽量紧凑合理,然后读上线的另一端该格式。

请参阅: http://en.wikipedia.org/wiki/Json第一句:“JSON ...是一个轻量级的基于文本的开放标准设计为人类可读的数据交换。”

从本质上讲,我的观点是,人类总是会看到JSON和机器将主要看到的二进制文件。 你得到两全其美的:可读性和小数据传输(在计算的少量费用)。



Answer 3:

gzip的将自己的第一次出现的小的反向引用替换邮件的重复部分。 该算法是非常“愚蠢”,但对这种重复数据的是伟大的。 我想你不会看到明显的跌幅超过了线的大小,因为你的对象“结构”只发送一次。

你可以拉上两个采样JSONs大致进行测试。 或通过捕获使用招的HTTP请求。 它可以显示压缩和非压缩的大小。



Answer 4:

由于您使用该移动设备(你提到3G)上,你可能真的想关心的大小,没有可读性。 此外,你经常希望读什么是网络线路上的传播?

这是另一种形式的建议。

protobuf的是一种选择。 谷歌使用它在内部,并且有一个的Protobuf'编译器可以读.proto文件(包含消息描述)和生成Java / C ++ / Python的串行器/解串器,其通过线路使用二进制形式以用于传输。 您只需使用两端生成的类,而忘记了什么物体看起来比时导线传输等。 此外,还有一个外部维护的OBJ-C端口 。

下面是一个比较的Protobuf对XML的protobuf的网站上(我知道XML是不是你用什么,仍然)。

最后,这里是一个Python的教程 。



Answer 5:

虽然是一个老问题,我想放些话。

根据我的经验,在生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
    }
  }
}

这是两个文件的片段。



文章来源: Is it worth the effort to try to reduce JSON size?