2013-10-23 7 views
15

मैं डेटाबेस से पूछताछ के लिए बहुत सारे AJAX कॉल का उपयोग कर रहा हूं और मुझे बड़े टेक्स्ट (जेसन) प्रतिक्रियाएं मिलती हैं। मैं प्रतिक्रिया को संपीड़ित करना चाहता हूं।JSON प्रतिक्रियाओं को कैसे संपीड़ित करें

JavaScript implementation of Gzip में जावास्क्रिप्ट का उपयोग कर पाठ को संपीड़ित करने का एक शानदार तरीका है।

समस्या यह है कि मैं अपने एएसपीएक्स सर्वर पर प्रतिक्रिया को संपीड़ित करना चाहता हूं और इसे जावास्क्रिप्ट के साथ डीकंप्रेस करना चाहता हूं। इसलिए मुझे अपने asp.net सर्वर पर lzw_encode फ़ंक्शन चलाने की आवश्यकता है। क्या मैं उस समारोह को सी # में अनुवाद कर सकता हूं या कोई और तरीका है?

अगर आप न आईआईएस या बदलने के हैडर कॉन्फ़िगर करने के लिए आप के साथ सर्वर पर कोड सेक कर सकते हैं ऊपर के लिंक का उपयोग करना:

सी #

public static string Compress(string s) 
    { 
     var dict = new Dictionary<string, int>(); 
     char[] data = s.ToArray(); 
     var output = new List<char>(); 
     char currChar; 
     string phrase = data[0].ToString(); 
     int code = 256; 

     for (var i = 1; i < data.Length; i++){ 
      currChar = data[i]; 
      var temp = phrase + currChar; 
      if (dict.ContainsKey(temp))     
       phrase += currChar;     
      else 
      { 
       if (phrase.Length > 1)      
        output.Add((char)dict[phrase]);      
       else      
        output.Add((char)phrase[0]);      
       dict[phrase + currChar] = code; 
       code++; 
       phrase = currChar.ToString(); 
      } 
     } 

     if (phrase.Length > 1)    
      output.Add((char)dict[phrase]);    
     else    
      output.Add((char)phrase[0]); 

     return new string(output.ToArray()); 
    } 

और ब्राउज़र पर आप इसे संपीड़ित कर सकते हैं साथ:

जावास्क्रिप्ट

// Decompress an LZW-encoded string 
function lzw_decode(s) { 
    var dict = {}; 
    var data = (s + "").split(""); 
    var currChar = data[0]; 
    var oldPhrase = currChar; 
    var out = [currChar]; 
    var code = 256; 
    var phrase; 
    for (var i = 1; i < data.length; i++) { 
     var currCode = data[i].charCodeAt(0); 
     if (currCode < 256) { 
      phrase = data[i]; 
     } 
     else { 
      phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar); 
     } 
     out.push(phrase); 
     currChar = phrase.charAt(0); 
     dict[code] = oldPhrase + currChar; 
     code++; 
     oldPhrase = phrase; 
    } 
    return out.join(""); 
} 
+8

JSON (और कोई अन्य) प्रतिक्रिया को संपीड़ित करने का सबसे आसान तरीका यह सुनिश्चित करना है कि आपका वेब सर्वर HTTP संपीड़न का उपयोग कर रहा है। http://en.wikipedia.org/wiki/HTTP_compression आपके प्रश्न में संदर्भित लिंक जावास्क्रिप्ट में डेटा संपीड़ित करने के बारे में वार्ता करता है ताकि सर्वर पर संग्रहीत होने पर यह कम संग्रहण स्थान ले ले। –

+0

हाँ यह शायद एक अधिक सुरुचिपूर्ण समाधान है। मैं इसे धन्यवाद देने का प्रयास करूंगा! –

+0

@ टोनोनाम - मैंने आपकी वास्तविक समस्या से मेल खाने के लिए प्रश्न बदल दिया है। वापस/संपादित करने के लिए स्वतंत्र महसूस करें। –

उत्तर

36

अपने सर्वर साइड प्रतिक्रिया ऑब्जेक्ट के भीतर GZip के लिए कोई ऐसा शीर्ष लेख, इस तरह:

Response.AddHeader("Content-Encoding", "gzip"); 

इसके अलावा, आप इस तरह अपनी सामग्री को संपीड़ित करने, GZipStream वर्ग का उपयोग कर सकते हैं:

Response.Filter = new GZipStream(Response.Filter, 
           CompressionMode.Compress); 
+0

यह ** सुपर ** उपयोगी है, काश मैं इसे एक और +100 दे सकता हूं। –

+0

यदि मैं जेसनआरसल्ट विधि का उपयोग करता हूं तो मैं इसका उपयोग कर सकता हूं: जेसन (खिलाड़ियों, जेसनआरक्वेटबेहियर.एलोवेट) को वापस लौटें; – VAAA

+1

कार्ल मैं भी 'Response.AddHeader' का उपयोग करने के तरीके के बारे में अधिक जानकारी चाहता हूं जैसे @VAAA मेरा 'रिटर्न जेसन' बनाने की कोशिश कर रहा है डेटा संपीड़न –

संबंधित मुद्दे