Kristian Nissen
Kristian Nissen

Reputation: 1184

Converting dynamic type to dictionary C#

I have a dynamic object that looks like this,

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

How can I convert this to a dictionary?

Upvotes: 34

Views: 76010

Answers (9)

Dmitry Shashurov
Dmitry Shashurov

Reputation: 1734

One line solution to convert your JSON text to Dictionary:

IDictionary<string, object> dict = new JavaScriptSerializer().Deserialize<IDictionary<string, object>>(json);

Then

if (dict.ContainsKey("field1"))
   string field1value = dict["field1"];

Upvotes: 0

Chris Moschini
Chris Moschini

Reputation: 37987

If you use the dynamic implementation here:

https://github.com/b9chris/GracefulDynamicDictionary

You can get the Dictionary right from the implementation. One advantage to using the above implementation (written for an answer to another SO question), is you can shift easily between the specific implementation and dynamic, like so:

    dynamic headers = new DDict();
    headers.Authorization = token;
    if (doesNeedSiteId)
        headers.SiteId = siteId;
    
    await post(headers);
}

protected async Task post(DDict headers)
{
    var dict = headers.GetDictionary(); // Dictionary<string, object>

In the above, the headers collection is conveniently created as a dynamic, but, the underlying specific implementation is DDict, and the post() method accepts it even though you've declared it as dynamic and used its features.

Upvotes: 0

Ada
Ada

Reputation: 261

Very similar to ema answer, but with a one-liner using LINQ magic:

Dictionary<string, object> myDict = sourceObject.GetType().GetProperties().ToDictionary(prop => prop.Name, prop => prop.GetValue(sourceObject, null));

Upvotes: 4

MarianoC
MarianoC

Reputation: 351

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.

Upvotes: 3

ema
ema

Reputation: 5783

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

Upvotes: 52

Brian Rogers
Brian Rogers

Reputation: 129817

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());

Upvotes: 23

annemartijn
annemartijn

Reputation: 1644

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

Upvotes: 42

Wasif Hossain
Wasif Hossain

Reputation: 3950

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

Upvotes: 14

Anıl Canlı
Anıl Canlı

Reputation: 434

You can do it with jsonSerializer. And it requires System.Net.Extensions reference. Here is a sample code.

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

Upvotes: 0

Related Questions