Oui, vous pouvez utiliser un IContractResolver
personnalisé pour appliquer par programmation un JsonConverter
à une classe ou à une propriété. La façon la plus simple de le faire est de dériver votre résolveur du DefaultContractResolver
classe, puis remplacez la méthode appropriée. Vous trouverez ci-dessous un exemple de résolveur qui demande à Json.Net d'utiliser un ObjectIdConverter
sur toutes les instances de ObjectId
type, quelle que soit la classe dans laquelle ils peuvent apparaître.
class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
Pour utiliser le résolveur, vous pouvez construire un JsonSerializer
instance et définissez le ContractResolver
propriété dessus, puis utilisez cette instance pour effectuer votre sérialisation/désérialisation. Si vous utilisez JObject.ToObject()
et JObject.FromObject()
, notez que les deux méthodes ont des surcharges qui acceptent un JsonSerializer
exemple.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Alternativement, si vous utilisez le JsonConvert
class pour faire votre sérialisation/désérialisation, vous pouvez créer une instance de JsonSerializerSettings
, définissez le ContractResolver
propriété dessus, puis passez les paramètres à SerializeObject()
et DeserializeObject()
méthodes.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
J'espère que cela vous aidera.