Да, можете да използвате персонализиран IContractResolver
за програмно прилагане на JsonConverter
към клас или собственост. Най-простият начин да направите това е да извлечете вашия резолвер от DefaultContractResolver
клас и след това отменете подходящия метод. По-долу е даден примерен преобразувател, който инструктира Json.Net да използва ObjectIdConverter
на всички екземпляри на ObjectId
тип, независимо в какъв клас може да се появят.
class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
За да използвате резолвера, можете да създадете JsonSerializer
екземпляр и задайте ContractResolver
свойство върху него, след което използвайте този екземпляр, за да извършите своята сериализация/десериализация. Ако използвате JObject.ToObject()
и JObject.FromObject()
, имайте предвид, че и двата метода имат претоварвания, които приемат JsonSerializer
пример.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Като алтернатива, ако използвате JsonConvert
клас, за да извършите своята сериализация/десериализация, можете да създадете екземпляр на JsonSerializerSettings
, задайте ContractResolver
свойство на това, след което предайте настройките на SerializeObject()
и DeserializeObject()
методи.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Надявам се това да помогне.