将动态类型转换为字典C#

Kri*_*sen 18 c# json dictionary dynamic json.net

我有一个看起来像这样的动态对象,

 {
    "2" : "foo",
    "5" : "bar",
    "8" : "foobar"
 }
Run Code Online (Sandbox Code Playgroud)

我该如何将其转换为dictionary

ann*_*ijn 31

您可以使用a RouteValueDictionary将C#对象转换为字典.请参阅:RouteValueDictionary类 - MSDN.它将object属性转换为键值对.

像这样使用它:

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

var result = new RouteValueDictionary(toBeConverted);
Run Code Online (Sandbox Code Playgroud)

  • 重新利用现有课程的巧妙方法! (6认同)

Bri*_*ers 22

如果你所评论的动态值是通过你在评论中提到的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
Run Code Online (Sandbox Code Playgroud)

如果你想Dictionary<string, string>改为,你可以像这样转换它:

Dictionary<string, string> newDict = 
          ((IEnumerable<KeyValuePair<string, JToken>>)dyn)
                     .ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString());
Run Code Online (Sandbox Code Playgroud)


ema*_*ema 21

您可以使用反射填充字典:

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


Was*_*ain 8

您可以使用Json.Net将其反序列化为字典.

string json = dynamicObject.ToString(); // suppose `dynamicObject` is your input
Dictionary<string, string> dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
Run Code Online (Sandbox Code Playgroud)

  • 好的,但是 `string json = dynamicObject.ToString()` 没有成功。你需要`string json = JsonConvert.SerializeObject(dynamicObject);` (2认同)