如何将NameValueCollection转换为JSON字符串?

The*_*ask 41 .net c# asp.net json namevaluecollection

我试过了:

  NameValueCollection Data = new NameValueCollection();
  Data.Add("foo","baa");
  string json = new JavaScriptSerializer().Serialize(Data);
Run Code Online (Sandbox Code Playgroud)

它返回:["foo"]我期望{"foo" : "baa"} 我该怎么做?

End*_*ono 41

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

thenvc.AllKeys.ToDictionary(k => k, k => thenvc[k]);
Run Code Online (Sandbox Code Playgroud)

如果您需要经常进行转换,还可以为NameValueCollection创建扩展方法:

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

所以你可以像这样在一行进行转换:

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

var dict = Data.ToDictionary();
Run Code Online (Sandbox Code Playgroud)

然后你可以序列化字典:

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

但NameValueCollection可以为一个键设置多个值,例如:

NameValueCollection Data = new NameValueCollection();
Data.Add("Foo", "baa");
Data.Add("Foo", "again?");
Run Code Online (Sandbox Code Playgroud)

如果你序列化这个你就会得到{"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));
}
Run Code Online (Sandbox Code Playgroud)

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


car*_*ira 38

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `NameValueCollection`每个键可以有多个值,但这并不能解决这个问题. (3认同)