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.