2011-08-09 18 views
35

मैंने कोशिश की:नामValueCollection से JSON स्ट्रिंग को कैसे परिवर्तित करें?

NameValueCollection Data = new NameValueCollection(); 
    Data.Add("foo","baa"); 
    string json = new JavaScriptSerializer().Serialize(Data); 

यह रिटर्न: ["foo"] मैं {"foo" : "baa"} उम्मीद मैं यह करने के लिए कैसे करते हैं?

उत्तर

34

NameValueCollection एक आईडीकी नहीं है, इसलिए JavaScriptSerializer सीधे इसकी अपेक्षा के अनुसार इसे क्रमबद्ध नहीं कर सकता है। आपको पहले इसे एक शब्दकोश में रूपांतरित करने की आवश्यकता होगी, फिर इसे क्रमबद्ध करें।

अद्यतन: प्रति कुंजी एकाधिक मानों के संबंध में निम्नलिखित प्रश्न, nvc[key] पर कॉल उन्हें आसानी से अल्पविराम से अलग कर देगा, जो ठीक हो सकता है। यदि नहीं, तो कोई भी हमेशा GetValues पर कॉल कर सकता है और यह तय कर सकता है कि मूल्यों के साथ उचित तरीके से क्या करना है। एक संभावित तरीका दिखाने के लिए नीचे दिए गए कोड को अपडेट किया गया।

public class StackOverflow_7003740 
{ 
    static Dictionary<string, object> NvcToDictionary(NameValueCollection nvc, bool handleMultipleValuesPerKey) 
    { 
     var result = new Dictionary<string, object>(); 
     foreach (string key in nvc.Keys) 
     { 
      if (handleMultipleValuesPerKey) 
      { 
       string[] values = nvc.GetValues(key); 
       if (values.Length == 1) 
       { 
        result.Add(key, values[0]); 
       } 
       else 
       { 
        result.Add(key, values); 
       } 
      } 
      else 
      { 
       result.Add(key, nvc[key]); 
      } 
     } 

     return result; 
    } 

    public static void Test() 
    { 
     NameValueCollection nvc = new NameValueCollection(); 
     nvc.Add("foo", "bar"); 
     nvc.Add("multiple", "first"); 
     nvc.Add("multiple", "second"); 

     foreach (var handleMultipleValuesPerKey in new bool[] { false, true }) 
     { 
      if (handleMultipleValuesPerKey) 
      { 
       Console.WriteLine("Using special handling for multiple values per key"); 
      } 
      var dict = NvcToDictionary(nvc, handleMultipleValuesPerKey); 
      string json = new JavaScriptSerializer().Serialize(dict); 
      Console.WriteLine(json); 
      Console.WriteLine(); 
     } 
    } 
} 
+3

'NameValueCollection' में प्रति कुंजी एकाधिक मान हो सकते हैं, यह उस समस्या को संबोधित नहीं करता है। – zzzzBov

+0

इस विधि से अपवाद का कारण बन जाएगा! NameValueCollection मौजूद क्यों है (और .NET कभी-कभी किसी शब्दकोश का उपयोग नहीं करता है) प्रति कुंजी एकाधिक मानों की अनुमति देना है। एक शब्दकोश के लिए प्रति एक और केवल एक कुंजी की आवश्यकता होती है। –

+1

विधि अपवाद नहीं फेंक देगा। यदि कई कुंजी हैं, तो 'एनवीसी [कुंजी]' उन्हें वापस ',' चरित्र से वापस कर देगा। लेकिन पूर्णता के लिए, मैंने उत्तर को इसके बारे में अधिक स्पष्ट होने के लिए अद्यतन किया। – carlosfigueira

3

अपने शब्दकोश कई प्रविष्टियों को रोकने के लिए इरादा नहीं है, तो आप वर्ग का उपयोग कर सकते हैं: System.Collections.Specialized.ListDictionary

33

एक तरह से क्रमानुसार करने NameValueCollection पहले यह परिवर्तित करके शब्दकोश और उसके बाद करने के लिए है शब्दकोश serialize। शब्दकोश में बदलने के लिए:

public static class NVCExtender 
{ 
    public static IDictionary<string, string> ToDictionary(
             this NameValueCollection source) 
    { 
     return source.AllKeys.ToDictionary(k => k, k => source[k]); 
    } 
} 

ताकि आप एक पंक्ति इस तरह में रूपांतरण कर सकते हैं:

thenvc.AllKeys.ToDictionary(k => k, k => thenvc[k]); 

आप अक्सर रूपांतरण करने की ज़रूरत है, तो आप भी NameValueCollection के लिए एक विस्तार विधि बना सकते हैं:

var json = new JavaScriptSerializer().Serialize(dict); 
// you get {"Foo":"baa"} 
:

NameValueCollection Data = new NameValueCollection(); 
Data.Add("Foo", "baa"); 

var dict = Data.ToDictionary(); 

तो फिर तुम शब्दकोश को क्रमानुसार कर सकते हैं

लेकिन NameValueCollection एक कुंजी के लिए अनेक मान हो सकते हैं, उदाहरण के लिए:

NameValueCollection Data = new NameValueCollection(); 
Data.Add("Foo", "baa"); 
Data.Add("Foo", "again?"); 

आप इस क्रमानुसार यदि आप {"Foo":"baa,again?"} मिल जाएगा।

आप कनवर्टर संशोधित बजाय IDictionary<string, string[]> निर्माण करने के लिए कर सकते हैं: {"Foo":["baa","again?"]}:

public static IDictionary<string, string[]> ToDictionary(
            this NameValueCollection source) 
{ 
    return source.AllKeys.ToDictionary(k => k, k => source.GetValues(k)); 
} 

तो तुम इस तरह धारावाहिक मूल्य मिल सकता है।

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