Ja, u kunt een aangepaste IContractResolver
. gebruiken om programmatisch een JsonConverter
toe te passen naar een klasse of eigendom. De eenvoudigste manier om dit te doen, is door uw resolver af te leiden uit de DefaultContractResolver
class en overschrijf vervolgens de juiste methode. Hieronder staat een voorbeeldresolver die Json.Net instrueert om een ObjectIdConverter
te gebruiken op alle instanties van de ObjectId
type, ongeacht in welke klasse ze kunnen voorkomen.
class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
Om de resolver te gebruiken, kunt u een JsonSerializer
. maken instantie en stel de ContractResolver
eigenschap erop, gebruik dan die instantie om uw serialisatie / deserialisatie uit te voeren. Als u JObject.ToObject()
. gebruikt en JObject.FromObject()
, houd er rekening mee dat beide methoden overbelastingen hebben die een JsonSerializer
accepteren instantie.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Als alternatief, als u de JsonConvert
. gebruikt class om uw serialisatie/deserialisatie uit te voeren, kunt u een instantie maken van JsonSerializerSettings
, stel de ContractResolver
. in eigenschap daarop en geef de instellingen vervolgens door aan de SerializeObject()
en DeserializeObject()
methoden.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Ik hoop dat dit helpt.