Ja, Sie können einen benutzerdefinierten IContractResolver
verwenden um einen JsonConverter
programmgesteuert anzuwenden zu einer Klasse oder Eigenschaft. Der einfachste Weg, dies zu tun, besteht darin, Ihren Resolver vom DefaultContractResolver
abzuleiten Klasse und überschreiben dann die entsprechende Methode. Unten ist ein Beispiel-Resolver, der Json.Net anweist, einen ObjectIdConverter
zu verwenden auf allen Instanzen der ObjectId
Typ, unabhängig davon, in welcher Klasse sie vorkommen.
class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
Um den Resolver zu verwenden, können Sie einen JsonSerializer
erstellen -Instanz und legen Sie den ContractResolver
fest -Eigenschaft darauf, und verwenden Sie dann diese Instanz, um Ihre Serialisierung/Deserialisierung durchzuführen. Wenn Sie JObject.ToObject()
verwenden und JObject.FromObject()
Beachten Sie, dass beide Methoden Überladungen haben, die einen JsonSerializer
akzeptieren Beispiel.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Alternativ, wenn Sie JsonConvert
verwenden Klasse, um Ihre Serialisierung/Deserialisierung durchzuführen, können Sie eine Instanz von JsonSerializerSettings
erstellen , legen Sie den ContractResolver
fest Eigenschaft darauf, dann übergeben Sie die Einstellungen an SerializeObject()
und DeserializeObject()
Methoden.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Hoffe das hilft.