我正在尝试设置一个阅读器,它将接收来自各种网站的 JSON 对象(想想信息抓取)并将它们翻译成 C# 对象。我目前正在使用 JSON.NET 进行反序列化过程。我遇到的问题是它不知道如何处理类中的接口级属性。所以自然的东西:
public IThingy Thing
会产生错误:
无法创建 IThingy 类型的实例。类型是接口或抽象类,不能实例化。
让它成为 IThingy 而不是 Thingy 相对重要,因为我正在处理的代码被认为是敏感的,并且单元测试非常重要。对于像 Thingy 这样成熟的对象,无法模拟原子测试脚本的对象。它们必须是一个接口。
我已经研究 JSON.NET 的文档一段时间了,我可以在这个网站上找到的与此相关的问题都是一年多以前的。有什么帮助吗?
此外,如果重要的话,我的应用程序是用 .NET 4.0 编写的。
如果您必须将 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; } }