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

我正在尝试建立一个读取器,该读取器将从各种网站中接收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; }

}

以上是 转换JSON.NET中反序列化的接口 的全部内容, 来源链接: utcz.com/qa/400869.html

回到顶部