I have a JsonConverter for my class DataType. I would like to do some special handling when plain string used in Json as the value of a property of type DataType. In the ca
One easy way to do it is to allocate an instance of your class then use JsonSerializer.Populate(JsonReader, Object). This is the way it is done in the standard CustomCreationConverter<T>:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value != null && reader.ValueType == typeof(string))
{
return someSpecialDataTypeInstance;
}
else if (reader.TokenType == JsonToken.StartObject)
{
existingValue = existingValue ?? serializer.ContractResolver.ResolveContract(objectType).DefaultCreator();
serializer.Populate(reader, existingValue);
return existingValue;
}
else if (reader.TokenType == JsonToken.Null)
{
return null;
}
else
{
throw new JsonSerializationException();
}
}
Limitations:
This does not handle situations when TypeNameHandling has been enabled and a "$type"
property is present specifying a polymorphic subtype.
In this case you'll need to do some of the tricks use by JsonDerivedTypeConverer<T>
in JsonConverter with Interface.
The type to be deserialized must have a parameterless constructor accessible to Json.NET. If not, and existingValue
is null, it will be necessary to construct it manually, via new DataType(arg1, arg2, ...)
.
Reference preservation via PreserveReferencesHandling is not supported.
For one approach to handle this situation see How can I choose what type to deserialize at runtime based on the structure of the json?.
Sample fiddle.