как конвертировать 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