Una forma de serializar NameValueCollection está convirtiendo en primer lugar al diccionario y luego serializar el diccionario. Para convertir al diccionario:
thenvc.AllKeys.ToDictionary(k => k, k => thenvc[k]);
Si usted tiene que hacer la conversión con frecuencia, también puede crear un método de extensión a NameValueCollection:
public static class NVCExtender
{
public static IDictionary<string, string> ToDictionary(
this NameValueCollection source)
{
return source.AllKeys.ToDictionary(k => k, k => source[k]);
}
}
lo que puede hacer la conversión en una línea como la siguiente:
NameValueCollection Data = new NameValueCollection();
Data.Add("Foo", "baa");
var dict = Data.ToDictionary();
A continuación, puede serializar el diccionario:
var json = new JavaScriptSerializer().Serialize(dict);
// you get {"Foo":"baa"}
Pero NameValueCollection puede tener varios valores para una clave, por ejemplo:
NameValueCollection Data = new NameValueCollection();
Data.Add("Foo", "baa");
Data.Add("Foo", "again?");
Si serializa este obtendrá {"Foo":"baa,again?"}
.
puede modificar el convertidor para producir IDictionary<string, string[]>
lugar:
public static IDictionary<string, string[]> ToDictionary(
this NameValueCollection source)
{
return source.AllKeys.ToDictionary(k => k, k => source.GetValues(k));
}
para que pueda obtener el valor serializado como esto: {"Foo":["baa","again?"]}
.
'NameValueCollection' podría tener varios valores por clave, esto no soluciona ese problema. – zzzzBov
¡Este método probablemente cause excepciones! La razón por la que existe NameValueCollection (y .NET no usa un diccionario a veces) es permitir múltiples valores por clave. Un diccionario requiere una y solo una clave por valor. –
El método no lanzará una excepción. Si hay varias teclas, 'nvc [key]' simplemente las devolverá unidas por un caracter ','. Pero, para completar, actualicé la respuesta para ser más explícito al respecto. – carlosfigueira