45

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.