ohadinho
ohadinho

Reputation: 7144

Deserialize JSON string to Dictionary<string,object>

I have this string:

[{ "processLevel" : "1" , "segments" : [{ "min" : "0", "max" : "600" }] }]

I'm deserializing the object:

object json = jsonSerializer.DeserializeObject(jsonString);

The object looks like:

object[0] = Key: "processLevel", Value: "1"
object[1] = Key: "segments", Value: ...

And trying to create a dictionary:

Dictionary<string, object> dic = json as Dictionary<string, object>;

but dic gets null.

What can be the issue?

Upvotes: 44

Views: 114650

Answers (5)

mridula
mridula

Reputation: 3281

The MSDN documentation for the as keyword states:

the statement expression as type is equivalent to the statement expression is type ? (type)expression : (type)null.

So if you run json.GetType() it will return System.Object[] and not System.Collections.Generic.Dictionary.

In cases like these where the type of object into which I want to deserialize a JSON object is complex, I use an API like Json.NET. You can write your own deserializer as:

class DictionaryConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        Throw(new NotImplementedException());            
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Your code to deserialize the json into a dictionary object.            
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Throw(new NotImplementedException());   
    }
}

And then you can use this serializer to read the JSON into your dictionary object. Here's an example.

Upvotes: 6

santosh singh
santosh singh

Reputation: 28672

See @mridula's answer for why you are getting null. But if you want to directly convert the JSON string to dictionary you can try following code snippet.

Dictionary<string, object> values = 
JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

Upvotes: 44

Alireza Marhamatabadi
Alireza Marhamatabadi

Reputation: 119

I had the same problem and found a solution to it

  • Very simple
  • No bugs
  • Tested on operational product

Step 1) Create a generic class with 2 property

     public class CustomDictionary<T1,T2> where T1:class where T2:class
      {
          public T1 Key { get; set; }
          public T2 Value { get; set; }
      }

Step 2) Create New class and inherit from first class

  public class SectionDictionary: CustomDictionary<FirstPageSectionModel, List<FirstPageContent>> 
    { 

    }

Step 3) Replace Dictionary and List

public Dictionary<FirstPageSectionModel, List<FirstPageContent>> Sections { get; set; }

and

 public List<SectionDictionary> Sections { get; set; }

Step 4) Serialize or Deserialize easely

 {
     firstPageFinal.Sections.Add(new SectionDictionary { Key= section,Value= contents });
     var str = JsonConvert.SerializeObject(firstPageFinal);
     var obj = JsonConvert.DeserializeObject<FirstPageByPlatformFinalV2>(str);
 }

Thanks a lot

Upvotes: 1

Blairg23
Blairg23

Reputation: 12075

I like this method:

using Newtonsoft.Json.Linq;
//jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, string> dictObj = jsonObj.ToObject<Dictionary<string, object>>();

You can now access anything you want using the dictObj as a dictionary. You can also use Dictionary<string, string> if you prefer to get the values as strings.

Upvotes: 10

Carles Company
Carles Company

Reputation: 7216

The problem is that the object is not of type Dictionary<string,object> or a compatible type, thus you can't cast directly. I would create a custom object and use Deserialize.

public class DeserializedObject{
    public string processLevel{get;set;}
    public object segments{get;set}
}

IEnumerable<DeserializedObject> object=jsonSerializer.Deserialize<IEnumerable<DeserializedObject>>(json);

Upvotes: -1

Related Questions