【发布时间】:2010-11-17 04:56:45
【问题描述】:
当涉及到不同的序列化格式时,我看到很多对“压缩 JSON”的引用。它到底是什么?它只是 gzip 压缩的 JSON 还是其他什么?
【问题讨论】:
标签: json serialization
当涉及到不同的序列化格式时,我看到很多对“压缩 JSON”的引用。它到底是什么?它只是 gzip 压缩的 JSON 还是其他什么?
【问题讨论】:
标签: json serialization
压缩后的 JSON 移除了 json 编码的 key:value 对,以将键和值存储在单独的并行数组中:
// uncompressed
JSON = {
data : [
{ field1 : 'data1', field2 : 'data2', field3 : 'data3' },
{ field1 : 'data4', field2 : 'data5', field3 : 'data6' },
.....
]
};
//compressed
JSON = {
data : [ 'data1','data2','data3','data4','data5','data6' ],
keys : [ 'field1', 'field2', 'field3' ]
};
我在这里找到的这种使用方法
来自链接的内容 (http://www.nwhite.net/?p=242)
我很少发现自己在编写使用纯 AJAX 的 javascript 应用程序的地方。我早就放弃了“X”并用“J”(JSON)代替了它。使用 Javascript 时,返回 JSON 是有意义的。自使用 JSON 以来,占用空间更小、解析更简单、结构更简单都是我获得的优势。
在最近的一个项目中,我发现自己对结果集的庞大感到不满。我返回的数据是表格数据,以每行对象的形式。我返回了 50 个结果集,每个有 19 个字段。我意识到,如果我增加我的结果集,我可以获得一种压缩形式。
// 未压缩
JSON = {
data : [
{ field1 : 'data1', field2 : 'data2', field3 : 'data3' },
{ field1 : 'data4', field2 : 'data5', field3 : 'data6' },
.....
]
};
//压缩
JSON = {
data : [ 'data1','data2','data3','data4','data5','data6' ],
keys : [ 'field1', 'field2', 'field3' ]
};
我将所有值合并到一个数组中,并将所有字段存储在一个单独的数组中。为每个结果返回一个键值对花费了我 8800 字节(8.6kb)。将这些字段取出并将它们放在一个单独的数组中花费了我 186 个字节。总共节省 8.4kb。
现在我有一个压缩程度更高的 JSON 文件,但结构不同,现在更难使用。所以我在Mootools中实现了一个解决方案,让解压透明化。
Request.JSON.extend({
options : {
inflate : []
}
});
Request.JSON.implement({
success : function(text){
this.response.json = JSON.decode(text, this.options.secure);
if(this.options.inflate.length){
this.options.inflate.each(function(rule){
var ret = ($defined(rule.store)) ? this.response.json[rule.store] : this.response.json[rule.data];
ret = this.expandData(this.response.json[rule.data], this.response.json[rule.keys]);
},this);
}
this.onSuccess(this.response.json, text);
},
expandData : function(data,keys){
var arr = [];
var len = data.length; var klen = keys.length;
var start = 0; var stop = klen;
while(stop < len){
arr.push( data.slice(start,stop).associate(keys) );
start = stop; stop += klen;
}
return arr;
}
});
Request.JSON now has an inflate option. You can inflate multiple segments of your JSON object if you so desire.
Usage:
new Request.JSON({
url : 'url',
inflate : [{ 'keys' : 'fields', 'data' : 'data' }]
onComplete : function(json){}
});
将任意数量的膨胀对象传递给选项膨胀数组。它有一个名为“store”的可选属性,如果设置,膨胀的数据集将存储在该键中。
“键”和“字段”期望字符串匹配 JSON 对象根中的位置。
【讨论】:
根据 Paniyar 的回答,我们可以使用 C# 将对象列表转换为“压缩”Json 格式,如下所示:
var JsonString = serializer.Serialize(
new
{
cols = new[] { "field1", "field2", "field3"},
items = data.Select(x => new object[] {x.field1, x.field2, x.field3})
});
我使用了一个对象数组,因为字段可以是 int、bool、string...
更多减少: 如果该字段经常重复并且它是字符串类型,则如果添加该字段的不同列表,则可以压缩更多...例如,字段名称工作职位,城市等非常适合这。您可以添加此项目的不同列表,并在每个项目中更改参考编号的值。这将使您的 Json 更精简。
【讨论】:
压缩:
[["KeyA", "KeyB", "KeyC", "KeyD", "KeyE", "KeyF"],
["ValA1", "ValB1", "ValC1", "ValD1", "ValE1", "ValF1"],
["ValA2", "ValB2", "ValC2", "ValD2", "ValE2", "ValF2"],
["ValA3", "ValB3", "ValC3", "ValD3", "ValE3", "ValF3"],
["ValA4", "ValB4", "ValC4", "ValD4", "ValE4", "ValF4"]]
未压缩:
[{KeyA: "ValA1", KeyB: "ValB1", KeyC: "ValC1", KeyD: "ValD1", KeyE: "ValE1", KeyF: "ValF1"},
{KeyA: "ValA2", KeyB: "ValB2", KeyC: "ValC2", KeyD: "ValD2", KeyE: "ValE2", KeyF: "ValF2"},
{KeyA: "ValA3", KeyB: "ValB3", KeyC: "ValC3", KeyD: "ValD3", KeyE: "ValE3", KeyF: "ValF3"},
{KeyA: "ValA4", KeyB: "ValB4", KeyC: "ValC4", KeyD: "ValD4", KeyE: "ValE4", KeyF: "ValF4"}]
【讨论】:
最可能的答案是它实际上只是压缩过的 JSON。这句话没有其他标准含义。
将同质的 JSON 对象数组重新组织成一对数组是一种非常有用的技术,可以使有效负载更小并加快编码和解码速度,通常不称为“压缩 JSON”。我从未在开源或任何开放 API 中遇到过它,但我们在内部使用这种技术并将其称为“jsontable”。
【讨论】: