Sí, puede usar un IContractResolver
personalizado para aplicar programáticamente un JsonConverter
a una clase o propiedad. La forma más sencilla de hacer esto es derivar su resolución del DefaultContractResolver
clase y luego invalidar el método apropiado. A continuación se muestra un ejemplo de resolución que le indica a Json.Net que use un ObjectIdConverter
en todas las instancias de ObjectId
tipo, independientemente de la clase en la que puedan 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 el resolver, puede construir un JsonSerializer
instancia y establezca el ContractResolver
property en él, luego use esa instancia para hacer su serialización/deserialización. Si está utilizando JObject.ToObject()
y JObject.FromObject()
, tenga en cuenta que ambos métodos tienen sobrecargas que aceptan un JsonSerializer
instancia.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Alternativamente, si está utilizando JsonConvert
class para hacer su serialización/deserialización, puede crear una instancia de JsonSerializerSettings
, configure el ContractResolver
propiedad en eso, luego pase la configuración a SerializeObject()
y DeserializeObject()
métodos.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Espero que esto ayude.