Sim, você pode usar um
IContractResolver
personalizado para aplicar programaticamente um JsonConverter
para uma classe ou propriedade. A maneira mais simples de fazer isso é derivar seu resolvedor do DefaultContractResolver
class e, em seguida, substitua o método apropriado. Abaixo está um exemplo de resolvedor que instrui o Json.Net a usar um ObjectIdConverter
em todas as instâncias do ObjectId
tipo, independentemente da classe em que possam aparecer. class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
Para usar o resolvedor, você pode construir um
JsonSerializer
instância e defina o ContractResolver
propriedade nele e use essa instância para fazer sua serialização/desserialização. Se você estiver usando JObject.ToObject()
e JObject.FromObject()
, observe que ambos os métodos têm sobrecargas que aceitam um JsonSerializer
instância. JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Como alternativa, se você estiver usando o
JsonConvert
class para fazer sua serialização/desserialização, você pode criar uma instância de JsonSerializerSettings
, defina o ContractResolver
propriedade sobre isso, então passe as configurações para o SerializeObject()
e DeserializeObject()
métodos. JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Espero que isto ajude.