Ja, du kan bruge en tilpasset IContractResolver
at programmere anvende en JsonConverter
til en klasse eller ejendom. Den nemmeste måde at gøre dette på er at udlede din resolver fra DefaultContractResolver
klasse og derefter tilsidesætte den relevante metode. Nedenfor er et eksempel på en resolver, der instruerer Json.Net til at bruge en ObjectIdConverter
på alle forekomster af ObjectId
type, uanset hvilken klasse de måtte optræde i.
class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
For at bruge resolveren kan du konstruere en JsonSerializer
instans og indstil ContractResolver
egenskab på den, og brug derefter den instans til at udføre din serialisering/deserialisering. Hvis du bruger JObject.ToObject()
og JObject.FromObject()
, bemærk, at begge metoder har overbelastninger, der accepterer en JsonSerializer
eksempel.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Alternativt, hvis du bruger JsonConvert
klasse for at udføre din serialisering/deserialisering, kan du oprette en forekomst af JsonSerializerSettings
, indstil ContractResolver
egenskab på det, og send derefter indstillingerne til SerializeObject()
og DeserializeObject()
metoder.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Håber dette hjælper.