I solved that problem by using a special setting for JsonSerializerSettings which is called TypeNameHandling.All
TypeNameHandling setting includes type information when serializing JSON and read type information so that the create types are created when deserializing JSON
Serialization:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
var text = JsonConvert.SerializeObject(configuration, settings);
Deserialization:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
var configuration = JsonConvert.DeserializeObject<YourClass>(json, settings);
The class YourClass might have any kind of base type fields and it will be serialized properly.