尝试减少JSON大小是否值得努力?

Att*_* O. 20 performance json http bandwidth

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

[{
    id: 12,
    score: 34,
    interval: 5678,
    sub: 9012
}, {
    id: ...
}, ...]
Run Code Online (Sandbox Code Playgroud)

我可以通过提交数组数组来减小有效负载:

[[12, 34, 5678, 9012], [...], ...]
Run Code Online (Sandbox Code Playgroud)

在属性名称上保存一些空间,并在服务器上重新创建对象(因为模式已修复,或者至少它是服务器和客户端之间的契约).

然后在POST请求中提交有效载荷,最有可能通过3G连接(或可能是wifi).

看起来我通过使用嵌套数组来节省一些带宽,但我不确定应用gzip时它是否明显,我不确定如何精确和客观地测量差异.

在另一方面,嵌套的数组不觉得是个好主意:他们不太容易阅读,因而更难调试时发现错误.此外,由于我们正在冲洗马桶的可读性,我们可以简化阵列,因为每个子阵列都有固定数量的元素,服务器可以将其切片并再次重建对象.

关于这个主题的任何进一步的阅读材料非常感谢.

Joh*_*zen 16

JSONH,又名hpack,https://github.com/WebReflection/JSONH做的事与你的例子非常相似:

[{
    id: 12,
    score: 34,
    interval: 5678,
    sub: 9012
}, {
    id: 98,
    score: 76,
    interval: 5432,
    sub: 1098
}, ...]
Run Code Online (Sandbox Code Playgroud)

会变成:

[["id","score","interval","sub"],12,34,5678,9012,98,76,5432,1098,...]
Run Code Online (Sandbox Code Playgroud)


art*_*nie 13

JSON是为了便于阅读.如果你担心空间,你可以有一个中间格式.创建一个序列化/反序列化函数,该函数接受一个JSON文件并创建一个压缩二进制文件,将数据存储得合理,然后在该行的另一端读取该格式.

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

从本质上讲,我的观点是人类总会看到JSON,机器会主要看到二进制文件.您可以获得两全其美:可读性和小数据传输(以少量计算为代价).


usr*_*usr 10

Gzip将使用对它们第一次出现的小反向引用来替换消息的重复部分.该算法非常"愚蠢",但对于这种重复数据,它非常棒.我认为你不会看到线上尺寸明显减少,因为你的对象"结构"只发送一次.

您可以通过压缩两个示例JSON来粗略地测试它.或者通过使用Fiddler捕获HTTP请求.它可以显示压缩和未压缩的大小.

  • GZIPed JSON vs GZIPed JSONH与_very_相似. (2认同)

Arj*_*kar 7

由于你在移动设备上使用它(你提到3G),你可能真的想要关心尺寸,而不是可读性.此外,您是否经常期望阅读通过电线传输的内容?

这是对替代表格的建议.

ProtoBuf是一种选择.Google在内部使用它,并且有一个ProtoBuf'编译器'可以读取.proto文件(包含消息描述)并生成Java/C++/Python序列化器/解串器,它们使用二进制形式通过线路传输.您只需在两端使用生成的类,并忘记通过线路传输时对象的外观.外部还有一个Obj-C端口.

下面是ProtoBuf网站上ProtoBuf与XML的比较(我知道XML不是你使用的,仍然是).

最后,这是一个Python教程.


小智 6

虽然这是一个老问题,但我想说一些话.

根据我的经验,json原始大小的差异很大,压缩后的数量很少.我更喜欢保持人类可读性.

在实际案例编号中:json文件为1,29MB,优化版本为145KB,压缩时为32KB和9KB.

除极端条件外,我认为这种差异可以忽略不计,可读性成本也很高.

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"
}
Run Code Online (Sandbox Code Playgroud)

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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是两个文件的片段.