2010-11-17 138 views
12

當涉及到不同的序列化格式時,我看到了很多對「壓縮JSON」的引用。究竟是什麼?它只是壓縮JSON或其他東西?什麼是「壓縮JSON」?

回答

20

壓縮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以來,佔用空間更小,解析更輕鬆,結構更簡單,這些都是我獲得的優勢。

在最近的一個項目中,我發現自己不滿意的大尺寸我的結果集。我返回的數據是表格數據,以每行對象的形式表示。我返回了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對象的根相匹配的位置。

+0

這得到我給予好評,如果你可以添加引用...從來沒有聽說過,聽起來很酷。 – Domenic 2010-11-17 05:11:30

+1

從文章中可以注意到,評論者「Isaac Schlueter」通過比較證明,這種方法比僅使用gzip效率低,儘管作者指出並非所有瀏覽器都接受gzip。 – Seanny123 2013-08-19 03:17:22

+0

現在這兩個鏈接都死了。有沒有支持這個的庫? – Nisarg 2017-08-02 06:15:42

0

最有可能的答案是,它真的只是gzip壓縮JSON。這句話沒有其他標準含義。

重新組織JSON的均勻陣列對象轉換成一對陣列是一種非常有用的技術,使有效載荷較小,並加快編碼和解碼,但是並不通常被稱爲「壓縮JSON」。我還沒有在開放源代碼或任何開放式API中運行它,但是我們在內部使用這種技術,並將其稱爲「jsontable」。

1

總部設在Paniyar的回答中,我們可以將對象列表中的「壓縮」 JSON格式使用C#這樣的:

var JsonString = serializer.Serialize(
new 
{ 
    cols = new[] { "field1", "field2", "field3"}, 
    items = data.Select(x => new object[] {x.field1, x.field2, x.field3}) 
}); 

我使用的對象的數組,因爲字段可以是整型,布爾,字符串...

減少更多: 如果該字段經常重複,這是一個字符串類型,你可以得到壓縮,如果你添加一個字段的不同列表...例如一個小更,字段名工作崗位,城市等是這方面的優秀人選。您可以添加這些項目的不同列表,並在每個項目中更改參考號碼的值。這會讓你的Json更精簡。

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