我正在尝试建立一个读取器,该读取器将从各种网站中接收JSON对象(考虑信息抓取)并将其转换为C#对象。我目前正在使用JSON.NET进行反序列化过程。我遇到的问题是它不知道如何处理类中的接口级属性。所以自然的东西:
public IThingy Thing
会产生错误:
无法创建类型为IThingy的实例。类型是接口或抽象类,无法实例化。
相对于Thingy,让它成为IThingy相对重要,因为我正在处理的代码被认为是敏感的,并且单元测试非常重要。对于像Thingy这样的成熟对象,无法为原子测试脚本模拟对象。它们必须是接口。
我已经研究JSON.NET的文档已有一段时间了,而我在此站点上可以找到的与此相关的问题都是一年多以前的。有什么帮助吗?
另外,如果有关系,我的应用程序是用.NET 4.0编写的。
@SamualDavis在一个相关的问题中提供了一个很好的解决方案,我将在这里进行总结。
如果必须将JSON流反序列化为具有接口属性的具体类,则可以 将具体类作为参数包含在该类的构造函数中! NewtonSoft反序列化器足够聪明,可以弄清楚它需要使用那些具体的类来反序列化属性。
这是一个例子:
public class Visit : IVisit { /// <summary> /// This constructor is required for the JSON deserializer to be able /// to identify concrete classes to use when deserializing the interface properties. /// </summary> public Visit(MyLocation location, Guest guest) { Location = location; Guest = guest; } public long VisitId { get; set; } public ILocation Location { get; set; } public DateTime VisitDate { get; set; } public IGuest Guest { get; set; } }