如何将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