Tak, możesz użyć niestandardowego IContractResolver aby programowo zastosować JsonConverter do klasy lub właściwości. Najprostszym sposobem, aby to zrobić, jest wyprowadzenie swojego resolvera z DefaultContractResolver klasy, a następnie nadpisać odpowiednią metodę. Poniżej znajduje się przykładowy program rozpoznawania nazw, który instruuje Json.Net, aby używał ObjectIdConverter we wszystkich wystąpieniach ObjectId typ, niezależnie od klasy, w której mogą się pojawić.
class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(ObjectId))
{
contract.Converter = new ObjectIdConverter();
}
return contract;
}
}
Aby użyć przelicznika, możesz skonstruować JsonSerializer instancję i ustaw ContractResolver na nim właściwość, a następnie użyj tego wystąpienia do wykonania serializacji/deserializacji. Jeśli używasz JObject.ToObject() i JObject.FromObject() , zwróć uwagę, że obie metody mają przeciążenia, które akceptują JsonSerializer przykład.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Alternatywnie, jeśli używasz JsonConvert do wykonania serializacji/deserializacji, możesz utworzyć instancję JsonSerializerSettings , ustaw ContractResolver tej właściwości, a następnie przekaż ustawienia do SerializeObject() i DeserializeObject() metody.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Mam nadzieję, że to pomoże.