I have a class definition that contains a property that returns an interface.
public class Foo
{
public int Number { get; set; }
public ISomething Thing { get; set; }
}
Attempting to serialize the Foo class using Json.NET gives me an error message like, "Could not create an instance of type 'ISomething'. ISomething may be an interface or abstract class."
Is there a Json.NET attribute or converter that would let me specify a concrete Something
class to use during deserialization?
One of the things you can do with Json.NET is:
var settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;
JsonConvert.SerializeObject(entity, Formatting.Indented, settings);
The TypeNameHandling
flag will add a $type
property to the JSON, which allows Json.NET to know which concrete type it needs to deserialize the object into. This allows you to deserialize an object while still fulfilling an interface or abstract base class.
The downside, however, is that this is very Json.NET-specific. The $type
will be a fully-qualified type, so if you're serializing it with type info,, the deserializer needs to be able to understand it as well.
Documentation: Serialization Settings with Json.NET