Ja, du kan använda en anpassad IContractResolver
för att programmässigt tillämpa en JsonConverter
till en klass eller fastighet. Det enklaste sättet att göra detta är att härleda din resolver från DefaultContractResolver
klass och åsidosätt sedan lämplig metod. Nedan finns ett exempel på resolver som instruerar Json.Net att använda en ObjectIdConverter
på alla instanser av ObjectId
typ, oavsett vilken klass de kan förekomma 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;
}
}
För att använda resolvern kan du konstruera en JsonSerializer
instans och ställ in ContractResolver
egenskap på den, använd sedan den instansen för att göra din serialisering/deserialisering. Om du använder JObject.ToObject()
och JObject.FromObject()
, notera att båda metoderna har överbelastningar som accepterar en JsonSerializer
instans.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Alternativt, om du använder JsonConvert
klass för att göra din serialisering/deserialisering, kan du skapa en instans av JsonSerializerSettings
, ställ in ContractResolver
egenskap på det och skicka sedan inställningarna till SerializeObject()
och DeserializeObject()
metoder.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Hoppas detta hjälper.