2
我正在使用ConcreteCollectionTypeConverter反序列化IList类型的对象。我可能做起来很错误的,因为我不断收到异常“无法转换目录到IList的”使用Newtonsoft JSON反序列化IList对象
我的目标inteface看起来是这样的:
[JsonObject(MemberSerialization.OptIn)]
public IMyInterface {
[JsonProperty("associatedContact")]
[JsonConverter(typeof(ConcreteCollectionTypeConverter<IList<ISomeOtherInterface>, List<SomeOtherInterface>>))]
IList<ISomeOtherInterface> MyObject { get; set; }
}
我的目标实现是这样的:
public MyImplementation : IMyInterface {
public List<SomeOtherImplementation> MyObject { get; set; }
public MyImplementations() {
MyObject = new List<SomeOtherImplementation>();
}
}
的json转换器看起来是这样的:
class ConcreteCollectionTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return serializer.Deserialize<TImplementation>(reader);
}
}
我打电话给我的项目中的其他地方的反序列化方法是这样的:
var myDeserializedObject = JsonConvert.DeserializeObject<MyImplementation>(jsonObject.ToString());
我上面提到的jsonObject被正确解析。
我知道这是可能的,因为我已经看到了一个来自用户调用SO的评论,他已经完成了它(Casting interfaces for deserialization in JSON.NET-接受的答案的第一评论)。
此方法适用于非集合项目(即使用JsonConverer(typeof(ConcreteTypeCOnverter))工作)反序列化接口类型IIterface MyObject的对象。
如果我只使用列表而不是IList,我甚至不需要类型转换器,但我的要求是确保ICollections的使用,因为可能存在非标准实现。