このような動的オブジェクトがありますが、
{
"2" : "foo",
"5" : "bar",
"8" : "foobar"
}
これをdictionary
に変換するにはどうすればよいですか?
RouteValueDictionary
を使用して、C#オブジェクトを辞書に変換できます。参照: RouteValueDictionary Class-MSDN 。 object
プロパティをキーと値のペアに変換します。
次のように使用します。
var toBeConverted = new {
foo = 2,
bar = 5,
foobar = 8
};
var result = new RouteValueDictionary(toBeConverted);
コメントで述べたように、問題の動的な値がJson.Netからの逆シリアル化によって作成された場合、 JObject
になります。 JObject
はすでにIDictionary<string, JToken>
を実装しているため、以下に示すように、変換せずに辞書として使用できます。
string json =
@"{ ""blah"" : { ""2"" : ""foo"", ""5"" : ""bar"", ""8"" : ""foobar"" } }";
var dict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
dynamic dyn = dict["blah"];
Console.WriteLine(dyn.GetType().FullName); // Newtonsoft.Json.Linq.JObject
Console.WriteLine(dyn["2"].ToString()); // foo
代わりにDictionary<string, string>
が必要な場合は、次のように変換できます。
Dictionary<string, string> newDict =
((IEnumerable<KeyValuePair<string, JToken>>)dyn)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString());
リフレクションを使用して辞書を埋めることができます。
public Dictionary<String, Object> Dyn2Dict(dynamic dynObj)
{
var dictionary = new Dictionary<string, object>();
foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(dynObj))
{
object obj = propertyDescriptor.GetValue(dynObj);
dictionary.Add(propertyDescriptor.Name, obj);
}
return dictionary;
}
Json.Net を使用して、辞書にデシリアライズできます。
string json = dynamicObject.ToString(); // suppose `dynamicObject` is your input
Dictionary<string, string> dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
別の方法は、.NET 4.5に含まれているSystem.Web.Helpers.Jsonを使用することです。
Json.Encode(object)およびJson.Decode。お気に入り:
Json.Decode<Generic.Dictionary<string, string>>(value);
よろしく、MaranoC。
JsonSerializerでできます。また、System.Net.Extensionsリファレンスが必要です。サンプルコードを次に示します。
var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string,string>>(jsonText);
var place = dict["8"]; // "foobar"