什么是“压缩JSON”?

时间:2010-11-17 04:56:45

标签: json serialization

当涉及到不同的序列化格式时,我看到很多对“压缩JSON”的引用。究竟是什么?它只是gzip压缩JSON还是别的什么?

4 个答案:

答案 0 :(得分:22)

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

将尽可能多的膨胀对象传递给选项inflate数组。它有一个名为'store'的可选属性。如果设置,膨胀的数据集将存储在该键中。

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

答案 1 :(得分: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更精简。

答案 2 :(得分:0)

最可能的答案是它真的只是gzip压缩JSON。这句话没有其他标准含义。

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

答案 3 :(得分:0)

压缩:

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