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

Sae*_*ati 24 javascript compression json http dry

考虑这个JSON响应:

[{
    Name: 'Saeed',
    Age: 31
}, {
    Name: 'Maysam',
    Age: 32
}, {
    Name: 'Mehdi',
    Age: 27
}]
Run Code Online (Sandbox Code Playgroud)

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

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

[['Name', 'Age'], 
['Saeed', 31], 
['Maysam', 32], 
['Mehdi', 27]]
Run Code Online (Sandbox Code Playgroud)

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

jfr*_*d00 15

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

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

['Saeed', 31, 'Maysam', 32, 'Mehdi', 27]
Run Code Online (Sandbox Code Playgroud)

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

"Saeed, 31, Maysam, 32, Mehdi, 27"
Run Code Online (Sandbox Code Playgroud)

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

["Saeed, 31, Maysam, 32, Mehdi, 27"]
Run Code Online (Sandbox Code Playgroud)

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


小智 10

一种解决方案称为hpack算法

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


Nie*_*sol 7

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

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

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


Mac*_*cke 5

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

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

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