如何将NameValueCollection转换为JSONstring?

我试过了:

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

它返回: ["foo"]我预计{"foo" : "baa"}我该如何做到这一点?

NameValueCollection不是一个IDictionary,所以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(); } } } 

序列化NameValueCollection的一种方法是首先将其转换为Dictionary,然后序列化Dictionary。 要转换成字典:

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

如果您需要频繁地进行转换,还可以为NameValueCollection创build一个扩展方法:

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

所以你可以做这样的一行转换:

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

然后你可以序列化字典:

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

但是,NameValueCollection对于一个键可以有多个值,例如:

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

如果你序列化这个,你会得到{"Foo":"baa,again?"}

您可以修改转换器来生成IDictionary<string, string[]>而不是:

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

所以你可以像这样得到序列化的值: {"Foo":["baa","again?"]}

如果您的字典不包含许多条目,您可以使用类:System.Collections.Specialized.ListDictionary