web-dev-qa-db-ja.com

動的な型を辞書C#に変換する

このような動的オブジェクトがありますが、

 {
    "2" : "foo",
    "5" : "bar",
    "8" : "foobar"
 }

これをdictionaryに変換するにはどうすればよいですか?

17
Kristian Nissen

RouteValueDictionary を使用して、C#オブジェクトを辞書に変換できます。参照: RouteValueDictionary Class-MSDNobjectプロパティをキーと値のペアに変換します。

次のように使用します。

var toBeConverted = new {
    foo = 2,
    bar = 5,
    foobar = 8
};

var result = new RouteValueDictionary(toBeConverted);
31
annemartijn

コメントで述べたように、問題の動的な値が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());
21
Brian Rogers

リフレクションを使用して辞書を埋めることができます。

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;
}
19
ema

Json.Net を使用して、辞書にデシリアライズできます。

string json = dynamicObject.ToString(); // suppose `dynamicObject` is your input
Dictionary<string, string> dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
8
Wasif Hossain

別の方法は、.NET 4.5に含まれているSystem.Web.Helpers.Jsonを使用することです。

Json.Encode(object)およびJson.Decode。お気に入り:

Json.Decode<Generic.Dictionary<string, string>>(value);

MSDN: https://msdn.Microsoft.com/en-us/library/gg547931(v = vs.111).aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet-1

よろしく、MaranoC。

3
MarianoC

JsonSerializerでできます。また、System.Net.Extensionsリファレンスが必要です。サンプルコードを次に示します。

var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string,string>>(jsonText);
var place = dict["8"]; // "foobar"
0
Anıl Canlı