Deserialize JSON string to Dictionary

后端 未结 5 1722
长情又很酷
长情又很酷 2020-11-30 04:32

I have this string:

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

I\'m deserializing the object:

相关标签:
5条回答
  • 2020-11-30 05:03

    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);
    
    0 讨论(0)
  • 2020-11-30 05:17

    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);
    
    0 讨论(0)
  • 2020-11-30 05:21

    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.

    0 讨论(0)
  • 2020-11-30 05:22

    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

    0 讨论(0)
  • 2020-11-30 05:29

    The MSDN documentation for the as keyword states that the statement expression as type is equivalent to the statement expression is type ? (type)expression : (type)null. 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.

    0 讨论(0)
提交回复
热议问题