2011-08-09 20 views

cevap

34

NameValueCollection bir IDictionary değil, bu nedenle JavaScriptSerializer doğrudan beklediğiniz gibi serileştiremiyor. İlk önce onu bir sözlüğe dönüştürmeniz, sonra da serileştirmeniz gerekir.

Güncelleştirme: Anahtar başına birden çok değerle ilgili aşağıdaki soruları yanıtlamak için, nvc[key] numaralı çağrıya basitçe onları virgülle ayırarak geri gönderebilirsiniz. Değilse, her zaman GetValues numaralı telefonu arayabilir ve uygun değerlerle ne yapacağına karar verebilir. Bir olası yolu göstermek için aşağıdaki kodu güncelledik.

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' anahtar başına birden çok değere sahip olabilir, bu, bu sorunu ele almaz. – zzzzBov

+0

Bu yöntem büyük olasılıkla istisnalara neden olur! NameValueCollection'ın (ve .NET'in bazen bir sözlük kullanmıyor) olmasının nedeni, anahtar başına birden çok değere izin verilmesidir. Bir sözlük, değer başına bir ve sadece bir anahtar gerektirir. –

+1

Yöntem, bir istisna alamaz. Birden fazla anahtar varsa, 'nvc [key]' sadece bir ',' karakteriyle birleştirilenleri döndürür. Ama bütünlük adına, cevabı daha açık bir şekilde güncelledim. – carlosfigueira

3

sizin Sözlük sayıda giriş içermesi amaçlanmıştır değilse, sınıfı kullanabilirsiniz: System.Collections.Specialized.ListDictionary NameValueCollection ilk dönüştürerek Sözlüğe ardından etmektir seri hale getirmek

33

Tek yön Sözlüğü serileştirir. sözlüğe dönüştürmek için:

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

yüzden böyle bir çizgide dönüşüm yapabilirsiniz: Sık sık dönüşüm yapmak gerekirse

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

, ayrıca NameValueCollection bir uzantı yöntemini oluşturabilirsiniz:

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

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

var dict = Data.ToDictionary(); 

Sonra sözlüğünü serileştirebilirsiniz

Ama NameValueCollection örneğin, bir anahtar için birden fazla değere sahip olabilir: Eğer {"Foo":"baa,again?"} alacak

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

Bu seri halinde.

yerine IDictionary<string, string[]> üretmek için dönüştürücü değiştirebilirsiniz: {"Foo":["baa","again?"]}:

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

Yani böyle tefrika değer elde edebilirsiniz.

İlgili konular