是否有任何众所周知的DRYing JSON方法

时间:2012-12-30 07:21:51

标签: javascript json http compression dry

考虑这个JSON响应:

[{
    Name: 'Saeed',
    Age: 31
}, {
    Name: 'Maysam',
    Age: 32
}, {
    Name: 'Mehdi',
    Age: 27
}]

这适用于少量数据,但是当您想要提供更大量的数据(例如数千条记录)时,以某种方式阻止响应JSON中的属性名称重复似乎是合乎逻辑的。

我用Google搜索了这个概念(DRYing JSON),令我惊讶的是,我没有找到任何相关的结果。当然,一种方法是使用简单的自制算法压缩JSON,然后在使用它之前在客户端解压缩它:

[['Name', 'Age'], 
['Saeed', 31], 
['Maysam', 32], 
['Mehdi', 27]]

然而,最好的做法是比每个试图重新发明轮子的开发人员更好。你们有没有看到一个众所周知的广为接受的解决方案?

5 个答案:

答案 0 :(得分:15)

首先,JSON并不是表示数据最紧凑的方式。这意味着可以直接解析为javascript数据结构,无需进一步解析即可立即使用。如果你想优化大小,那么你可能不希望自我描述JSON,你需要允许你的代码做一些关于如何处理数据并使用它并在接收时做一些手动解析的假设结束。正是这些假设和额外的编码工作可以为您节省空间。

如果代码已知服务器响应的属性名称和格式,则只能将数据作为交替值的数组返回:

['Saeed', 31, 'Maysam', 32, 'Mehdi', 27]

或者如果可以安全地假设名称不包含逗号,您甚至可以返回一个逗号分隔的字符串,您可以将其拆分为多个部分并粘贴到您自己的数据结构中:

"Saeed, 31, Maysam, 32, Mehdi, 27"

或者如果您仍然希望它是有效的JSON,您可以将该字符串放在这样的数组中,这比我的第一个版本稍微好一点,其中项目本身就是数组元素:

["Saeed, 31, Maysam, 32, Mehdi, 27"]

这些假设和紧凑性使得在您自己的javascript上解析数据的责任更大,但是删除自己开始使用的完整JSON的自描述性质会导致其更紧凑的性质。

答案 1 :(得分:10)

一种解决方案称为hpack算法

https://github.com/WebReflection/json.hpack/wiki

答案 2 :(得分:7)

您可以使用CSV格式而不是JSON,因为您只需指定一次属性名称。但是,这需要像您的示例中那样的刚性结构。

JSON并不是真正适合DRY的东西,因为考虑到你可以用它做什么,它已经很好地打包了。就个人而言,我已将裸阵列用于存储在文件中供以后使用的JSON数据,但对于简单的AJAX请求,我只是将其保留原样。

DRY通常是指您自己编写的内容,因此如果您的对象是动态生成的,那么无论如何都不要担心。

答案 3 :(得分:5)

使用gzip-compression,它通常很容易内置到大多数网络服务器和客户端?

仍然需要一些(额外的)时间&记忆生成&在每一端解析JSON,但通过网络发送不会花费太多时间,并且代表您将花费最少的实施工作。

即使您以某种方式预压缩源数据,也可能值得一试。

答案 4 :(得分:1)

JSON实际上并不是一个问题,你经常会遇到大量的字符串或“属性”重复(也不是XML)。

这正是DEFLATE算法地址的duplicate string elimination组件(由GZip使用)。

虽然大多数浏览器客户端都可以接受GZip压缩的响应,但回流到服务器的流量不会。

这是否保证使用“JSON压缩”(即hpack或其他一些方案)?

  1. 它不可能比在Javascript中实现GZip压缩快得多(这不是不可能的;在相当快的机器上,你可以在250毫秒内压缩100 KB)。

  2. 安全处理不受信任的JSON输入非常困难。您需要使用基于流的解析并确定最大复杂性阈值,否则您的服务器可能会出乎意料。例如,参见Armin Ronacher的Start Writing More Classes

      

    如果你整洁的小型网络服务器通过gevent获得10000次请求,但是正在使用json.loads,那么我可以通过发送16MB精心设计和嵌套的JSON来占用所有CPU,从而使其停止爬行。