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.