小编典典

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

all

我正在尝试设置一个阅读器,它将接收来自各种网站的 JSON 对象(想想信息抓取)并将它们翻译成 C# 对象。我目前正在使用 JSON.NET
进行反序列化过程。我遇到的问题是它不知道如何处理类中的接口级属性。所以自然的东西:

public IThingy Thing

会产生错误:

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

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

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

此外,如果重要的话,我的应用程序是用 .NET 4.0 编写的。


阅读 93

收藏
2022-09-02

共1个答案

小编典典

如果您必须将 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; }
}
2022-09-02