There is a base class AudioObject , from which two classes are inherited: Audio and AudioUser . We also have the AudioList class, in which there is a List<AudioObject> field. This field can store a list of objects of mixed types: Audio and AudioUser .

 public class AudioObject { } public class Audio : AudioObject { public uint id { get; set; } public string title { get; set; } } public class AudioUser : AudioObject { public string id { get; set; } public string name { get; set; } } public class AudioList { public int count { get; set; } public List<AudioObject> list { get; set; } } 

Let's try to serialize and decrialize the AudioList AudioList :

 AudioList list = new AudioList(); list.count = 1; list.list = new List<AudioObject> { new Audio { id = 1, title = "Test"} }; string serialized = JsonConvert.SerializeObject(list); AudioList newList = JsonConvert.DeserializeObject<AudioList>(serialized); Audio audio = newList.list[0] as Audio; 

Serialization is successful, but deserialization returns null objects from the List<AudioObject> .

What's my mistake?

  • You would indicate in which JSON you have serialized. - Athari 2:55 pm
  • Here is the result of serialization: "{" count ": 1," list ": [{" id ": 1," title ":" Test "}]}" - Anatoly Karpekin

2 answers 2

The AudioObject class is according to the List<> declaration. Add type information to [de] serialization:

 AudioList list = new AudioList(); list.count = 1; list.list = new List<AudioObject> { new Audio { id = 1, title = "Test"} }; JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All }; string serialized = JsonConvert.SerializeObject(list, settings); AudioList newList = JsonConvert.DeserializeObject<AudioList>(serialized, settings); Audio audio = newList.list[0] as Audio; 
  • 2
    Probably you: d - nicael

Use the TypeNameHandling setting to keep the type information in JSON:

 JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto // или All для того, чтобы десериализовать не только объекты дочерних типов, // но и коллекции разных типов (IList/IEnumerable) }; string serialized = JsonConvert.SerializeObject(list, settings); AudioList newList = JsonConvert.DeserializeObject<AudioList>(serialized, settings); Audio audio = newList.list[0] as Audio; // != null 
  • Thank you, everything worked - Anatoly Karpekin