Sì, puoi utilizzare un IContractResolver
personalizzato per applicare a livello di codice un JsonConverter
a una classe o proprietà. Il modo più semplice per farlo è derivare il tuo risolutore da DefaultContractResolver
class e quindi sovrascrivere il metodo appropriato. Di seguito è riportato un esempio di risolutore che indica a Json.Net di utilizzare un ObjectIdConverter
su tutte le istanze di ObjectId
digita, indipendentemente dalla classe in cui potrebbero apparire.
class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
Per utilizzare il risolutore, puoi costruire un JsonSerializer
istanza e impostare il ContractResolver
proprietà su di esso, quindi usa quell'istanza per eseguire la serializzazione/deserializzazione. Se stai usando JObject.ToObject()
e JObject.FromObject()
, nota che entrambi i metodi hanno overload che accettano un JsonSerializer
esempio.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
In alternativa, se stai usando JsonConvert
classe per eseguire la serializzazione/deserializzazione, puoi creare un'istanza di JsonSerializerSettings
, imposta il ContractResolver
proprietà su quello, quindi passa le impostazioni a SerializeObject()
e DeserializeObject()
metodi.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Spero che questo aiuti.