Да, можете да използвате персонализиран 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);
Надявам се това да помогне.