44

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?

1
  • If "json as IDictionary<string, object>", var json = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, new ExpandoObjectConverter()); // Maybe ExpandoObject is the dynamic object you were thinking. Commented Aug 18, 2017 at 16:39

5 Answers 5

44

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);
Sign up to request clarification or add additional context in comments.

2 Comments

but I want to deserialize to a class that has properties as Dictionary and other normal properties. How can I do that?
For my scenario I noticed that the property was read only. So the deserialization process couldn't set the value. In my case I changed to not be read only, and it worked!! But I think you can create a constructor that receive the property, if you prefer to keep it as read only
10

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.

3 Comments

Thanks for including the using line, too many examples leave that out.
@Blairg23 In the above example it should be ` jsonObj.ToObject<Dictionary<string, string>>();`
How would you turn the dictObj back to a json-formatted string?
6

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.

1 Comment

This answer on a related problem has the full source code for the solution: stackoverflow.com/a/31250524/356550
1

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

2 Comments

"No bugs" - I can count at least 4 in your code already. Sorry, but I downvoted this answer.
And what are the 4 bugs?
-1

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.