Converting dynamic type to dictionary C#

55,868

Solution 1

You can use a RouteValueDictionary to convert a C# object to a dictionary. See: RouteValueDictionary Class - MSDN. It converts object properties to key-value pairs.

Use it like this:

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

var result = new RouteValueDictionary(toBeConverted);

Solution 2

You can fill the dictionary using reflection:

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

Solution 3

If the dynamic value in question was created via deserialization from Json.Net as you mentioned in your comments, then it should be a JObject. It turns out that JObject already implements IDictionary<string, JToken>, so you can use it as a dictionary without any conversion, as shown below:

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

If you would rather have a Dictionary<string, string> instead, you can convert it like this:

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

Solution 4

You can use Json.Net to deserialize it to dictionary.

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

Solution 5

Another way is using System.Web.Helpers.Json included in .NET 4.5.

Json.Encode(object) and Json.Decode. Like:

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

Regards, MarianoC.

Share:
55,868
Kristian Nissen
Author by

Kristian Nissen

:D

Updated on January 05, 2021

Comments

  • Kristian Nissen
    Kristian Nissen over 3 years

    I have a dynamic object that looks like this,

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

    How can I convert this to a dictionary?