как конвертировать NameValueCollection в строку JSON?
пробовал:
NameValueCollection Data = new NameValueCollection();
Data.Add("foo","baa");
string json = new JavaScriptSerializer().Serialize(Data);
возвращает: ["foo"]
Я ожидал {"foo" : "baa"}
Как мне это сделать?
3 ответов
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 - сначала преобразовать его в словарь, а затем сериализовать словарь. Чтобы преобразовать в словарь:
thenvc.AllKeys.ToDictionary(k => k, k => thenvc[k]);
Если вам нужно часто выполнять преобразование, вы также можете создать метод расширения для NameValueCollection:
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?"]}
.
Если словарь не должен содержать много записей, можно использовать класс: Система.Коллекции.Специализированный.ListDictionary