Ano, můžete použít vlastní IContractResolver pro programové použití JsonConverter do třídy nebo vlastnosti. Nejjednodušší způsob, jak toho dosáhnout, je odvodit svůj resolver z DefaultContractResolver třídy a poté přepište příslušnou metodu. Níže je uveden příklad resolveru, který dává Json.Net pokyn k použití ObjectIdConverter na všech instancích ObjectId typu, bez ohledu na to, v jaké třídě se mohou objevit.
class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
Chcete-li použít resolver, můžete vytvořit JsonSerializer a nastavte ContractResolver vlastnost na něm, pak použijte tuto instanci k provedení serializace/deserializace. Pokud používáte JObject.ToObject() a JObject.FromObject() , všimněte si, že obě metody mají přetížení, která přijímají JsonSerializer instance.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Případně, pokud používáte JsonConvert třídy k provedení serializace/deserializace, můžete vytvořit instanci JsonSerializerSettings , nastavte ContractResolver vlastnost na tom, pak předejte nastavení SerializeObject() a DeserializeObject() metody.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Doufám, že to pomůže.