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.