一尘不染

在JSON.NET中强制转换反序列化的接口

c#

我正在尝试建立一个读取器,该读取器将从各个网站接收JSON对象(考虑信息抓取)并将其转换为C#对象。我目前正在使用JSON.NET进行反序列化过程。我遇到的问题是它不知道如何处理类中的接口级属性。所以自然的东西:

public IThingy Thing

会产生错误:

无法创建类型为IThingy的实例。类型是接口或抽象类,无法实例化。

相对于Thingy,让它成为IThingy相对重要,因为我正在处理的代码被认为是敏感的,并且单元测试非常重要。对于像Thingy这样的成熟对象,无法为原子测试脚本模拟对象。它们必须是接口。

我已经研究了JSON.NET的文档已有一段时间了,而我在此站点上可以找到的与此相关的问题都来自一年多以前。有什么帮助吗?

另外,如果有关系,我的应用程序是用.NET 4.0编写的。


阅读 228

收藏
2020-05-19

共1个答案

一尘不染

@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; }
}
2020-05-19