私は試した:
NameValueCollection Data = new NameValueCollection();
Data.Add("foo","baa");
string json = new JavaScriptSerializer().Serialize(Data);
それは戻ります:["foo"]
私{"foo" : "baa"}
はこれをどのように行うのですか?
私は試した:
NameValueCollection Data = new NameValueCollection();
Data.Add("foo","baa");
string json = new JavaScriptSerializer().Serialize(Data);
それは戻ります:["foo"]
私{"foo" : "baa"}
はこれをどのように行うのですか?
NameValueCollection をシリアル化する 1 つの方法は、まずそれを Dictionary に変換してから Dictionary をシリアル化することです。辞書に変換するには:
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]);
}
}
したがって、次のように 1 行で変換を行うことができます。
NameValueCollection Data = new NameValueCollection();
Data.Add("Foo", "baa");
var dict = Data.ToDictionary();
次に、辞書をシリアル化できます。
var json = new JavaScriptSerializer().Serialize(dict);
// you get {"Foo":"baa"}
ただし、NameValueCollection は 1 つのキーに対して複数の値を持つことができます。次に例を示します。
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?"]}
。
NameValueCollection
は IDictionary ではないため、JavaScriptSerializer
期待どおりに直接シリアル化することはできません。最初に辞書に変換してから、シリアル化する必要があります。
更新: キーごとの複数の値に関する次の質問では、 を呼び出すとnvc[key]
カンマで区切られた値が返されますが、これで問題ない場合があります。そうでない場合は、いつでも呼び出しGetValues
て、値を適切に処理する方法を決定できます。以下のコードを更新して、考えられる方法の 1 つを示しました。
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();
}
}
}
ディクショナリに多くのエントリを含めることを意図していない場合は、次のクラスを使用できます。
System.Collections.Specialized.ListDictionary