我的问题是,当转换器应用于接口的实现并且属性类型是接口时,json.net 反序列化过程似乎没有调用我的 JsonConverter。我使用 TypeNameHandling = TypeNameHandling.Objects 将 $type 添加到 json 中。我在序列化和反序列化时都这样做。当我有一个接口实现的属性时,会正确调用类的转换器。但是当我有接口类型的属性时,不会调用具体类的转换器。
当我反序列化此类时,我的 JsonDataBagCreationConverter 将由 RealTelephone 调用,但不会由 Telephone 调用,因为这是一个接口。即使它们都使用正确的 $type 序列化。这导致 RealTelephone 的 .Data 被填充,而 Telephones .Data 为空。
[JsonConverter(typeof(JsonDataBagCreationConverter<ContainerForITelephone>))]
public class ContainerForITelephone : IDataBag
{
private object _data;
private DataBagTypeEnum _dataBagTypeEnum;
public ITelephone Telephone { get; set; }
public Telephone RealTelephone { get; set; }
public object Data
{
get { return _data; }
set { _data = value; }
}
public DataBagTypeEnum DataBagType_Enum
{
get { return _dataBagTypeEnum; }
}
}
不会为 Telephone 属性调用此 jsonconverter。但它适用于RealTelephone。
public class JsonDataBagCreationConverter<T> : JsonConverter where T : IDataBag, new()
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType != JsonToken.Null)
{
var jsonObject = JObject.Load(reader);
var target = Create(objectType, jsonObject);
serializer.Populate(jsonObject.CreateReader(), target);
((IDataBag)target).Data = jsonObject.ToString();
return target;
}
return null;
}
}
[JsonConverter(typeof(JsonDataBagCreationConverter<Telephone>))]
public class Telephone : ITelephone
{
public string Name { get; set; }
public string AreaCode { get; set; }
public string Number { get; set; }
public SubPhone SubPhone { get; set; }
public object Data { get; set; }
public DataBagTypeEnum DataBagType_Enum { get; set; }
}
我期待着您的回音,谢谢
简