"压缩JSON"是什么?

20

在涉及不同序列化格式时,我看到很多关于“压缩JSON”的引用。它究竟是什么?它只是gzip压缩的JSON还是其他东西?

4个回答

28

压缩的 JSON 去除了 JSON 编码中的键值对,转而将键和值存储在分离的并行数组中:

// 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 以来,我获得了更小的占用空间、更易于解析和更简单的结构等所有优势。

在最近的一个项目中,我发现我的结果集太大了,让我感到不满意。我返回的数据是表格数据,以每行一个对象的形式呈现。我返回了一个有19个字段的结果集,共50个结果。我意识到,如果我增加我的结果集,就可以获得一种压缩形式。

// 未压缩

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){}
});

您可以向选项inflate数组中传递任意数量的inflate对象。它有一个可选属性称为'store'。如果设置了此属性,将在该键中存储膨胀的数据集。

'keys'和'fields'期望匹配JSON对象根目录中的位置的字符串。


如果你能添加引用,这将得到我的赞同...我以前从未听说过它,听起来相当不错。 - Domenic
1
从这篇文章中需要注意的一点是,评论者“Isaac Schlueter”通过比较证明了这种方法不如直接使用gzip高效,尽管作者指出并非所有浏览器都支持gzip。 - Seanny123
这两个链接现在都失效了。 是否有任何库支持此功能? - Nisarg Shah
@Seanny123 如果将此压缩与gzip结合使用,它很可能会更小。 - qwr
这不是“压缩JSON”的标准含义。 - Tony

2

压缩:

[["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"}]

1
这不是“压缩JSON”的标准含义。 - Tony

1

最有可能的答案是它确实只是经过gzip压缩的JSON。这个短语没有其他标准含义。

将同类JSON对象数组重新组织成一对数组是一种非常有用的技术,可以使有效载荷更小并加快编码和解码速度,但它通常不被称为“压缩JSON”。我在开源或任何开放API中从未遇到过它,但我们在内部使用这种技术,并称其为“jsontable”。


1

根据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更轻巧。

这不是“压缩JSON”的标准含义。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接