2010-11-17 16 views
12

जब मैं विभिन्न धारावाहिक प्रारूपों की बात करता हूं तो मुझे "संपीड़ित JSON" के बहुत से संदर्भ दिखाई देते हैं। यह वास्तव में क्या है क्या यह सिर्फ JSON या कुछ और gzipped है? दुकान कुंजी और अलग समानांतर सरणियों में मानों को json के कूट का मूल्य जोड़ी:"संपीड़ित JSON" क्या है?

उत्तर

20

संपीडित 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 को अपने शुद्ध रूप में उपयोग करते हैं। मैंने लंबे समय से 'एक्स' को त्याग दिया है और इसे 'जे' (जेएसओएन) के साथ बदल दिया है। जावास्क्रिप्ट के साथ काम करते समय, यह जेएसओएन वापस करने के लिए समझ में आता है। छोटे पदचिह्न, आसान पार्सिंग और एक आसान संरचना जेएसओएन का उपयोग करने के बाद से प्राप्त सभी फायदे हैं।

हाल के एक प्रोजेक्ट में मैंने अपने परिणाम सेट के बड़े आकार से खुद को नाखुश पाया। जिस डेटा को मैं वापस कर रहा था वह प्रत्येक पंक्ति के लिए ऑब्जेक्ट्स के रूप में सारणीबद्ध डेटा था। मैं 50 के परिणाम सेट को वापस कर रहा था, जिसमें प्रत्येक 1 9 फ़ील्ड थे। मुझे एहसास हुआ कि अगर मैं अपना परिणाम सेट बढ़ाता हूं तो मुझे संपीड़न का एक रूप मिल सकता है।

// असम्पीडित

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.6 केबी) खर्च हुआ। खेतों को फिसलने और उन्हें एक अलग सरणी में डालने से मुझे 186 बाइट्स खर्च हुए। कुल बचत 8.4kb।

अब मेरे पास एक बहुत अधिक संपीड़ित JSON फ़ाइल है, लेकिन संरचना अलग है और अब काम करने में कठिन है। इसलिए मैं डिकंप्रेशन पारदर्शी बनाने के लिए मुट्टूल में एक समाधान लागू करता हूं।

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 ऑब्जेक्ट्स पास करें। इसमें 'स्टोर' नामक एक वैकल्पिक संपत्ति है यदि सेट किए गए डेटा सेट को उस कुंजी में संग्रहीत किया जाएगा।

'कुंजी' और 'फ़ील्ड' तारों को आपके JSON ऑब्जेक्ट की जड़ में किसी स्थान से मिलान करने की अपेक्षा करते हैं।

+0

आप एक प्रशस्ति पत्र ... इससे पहले कि यह कभी नहीं सुना जोड़ सकते हैं और यह बहुत अच्छा लग रहा है, तो यह मेरा वोट दें हो जाता है। – Domenic

+1

लेख से कुछ ध्यान देने के लिए, एक टिप्पणीकर्ता "आइजैक श्लीटर" तुलना के माध्यम से साबित होता है कि यह विधि केवल gzip का उपयोग करने से कम कुशल है, हालांकि लेखक नोट करता है कि सभी ब्राउज़र gzip स्वीकार नहीं करते हैं। – Seanny123

+0

दोनों लिंक अब मर चुके हैं। क्या कोई पुस्तकालय है जो इसका समर्थन करता है? – Nisarg

0

सबसे अधिक संभावना जवाब यह है कि यह वास्तव में सिर्फ जेएसओएन gzipped है। इस वाक्यांश के लिए कोई अन्य मानक अर्थ नहीं है।

एरे की एक जोड़ी में JSON ऑब्जेक्ट्स का एक समरूप सरणी पुन: व्यवस्थित करना पेलोड को छोटा करने और एन्कोडिंग और डिकोडिंग को गति देने के लिए एक बहुत ही उपयोगी तकनीक है, इसे आमतौर पर "संपीड़ित JSON" नहीं कहा जाता है। मैंने इसे कभी भी ओपन सोर्स या किसी ओपन एपीआई में नहीं चलाया है, लेकिन हम आंतरिक रूप से इस तकनीक का उपयोग करते हैं और इसे "jsontable" कहते हैं।

1

Paniyar के जवाब में आधार पर, हम इस तरह "संकुचित" JSON प्रारूप का उपयोग कर सी # में वस्तुओं की एक सूची में बदल सकते हैं:

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

मैं वस्तु की एक सरणी के लिए इस्तेमाल किया क्योंकि खेतों पूर्णांक, bool, स्ट्रिंग हो सकती है ...

अधिक कटौती: क्षेत्र बहुत बार दोहराया है और यह आपको संकुचित कर सकते हैं यदि आप उस क्षेत्र की एक अलग सूची में जोड़ने के ... उदाहरण के लिए एक छोटे से अधिक हो एक फ़ील्ड नाम एक स्ट्रिंग प्रकार है,, तो नौकरी की स्थिति, शहर, आदि इसके लिए उत्कृष्ट उम्मीदवार हैं। आप इन वस्तुओं की एक अलग सूची जोड़ सकते हैं और प्रत्येक आइटम में संदर्भ संख्या के लिए मान बदल सकते हैं। इससे आपका जेसन अधिक लाइट बन जाएगा।

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"}] 
संबंधित मुद्दे