当前位置: 首页 > 面试题库 >

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

姬烨磊
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 将对象反序列化为()时,嵌套对象反序列化为s。是否可以强制将嵌套对象反序列化为s? 问题答案: 我找到了一种通过提供实现将所有嵌套对象转换为的方法: 文档: Json.NET的CustomCreationConverter

  • 问题内容: 我正在反序列化使用的对象,该对象包含Guid类型的私有字段和该字段的公共属性。当我的json中的my的值为null时,我想分配给我的字段。 但是想要访问私有字段,导致在尝试反序列化时出现此错误: 将值{null}转换为类型’System.Guid’时出错。路径“ [0]。属性”,第6行,位置26。 如何使其忽略私有字段,而使用公共属性? 问题答案: Json.NET拒绝为a 设置值,因

  • 问题内容: 我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性? 基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。 我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。 编辑: 这里还有一些背景。这背后的原因是我的课看起来像: 我需要请求的属性,但是我不希望它反序列化并触发设置程序逻辑。 问题答案: 最简单的方法是将

  • 问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当

  • 问题内容: 我目前有一个处理程序,该处理程序获取excel文件的文件路径和标签名,将文件处理为数据表,然后将表序列化为json字符串以返回。在尝试处理大文件之前,此方法一直有效,然后出现内存不足异常。 我在想,如果不先将所有内容加载到数据表中,而是直接加载到json字符串中,它将减少内存使用。但是,我一直找不到如何执行此操作的任何示例。 我可以直接从OleDbConnection序列化为字符串吗?

  • 问题内容: 我有一堂课 我想将下面的JSON数据反序列化到上面的类/对象中 我的想法是在JSON中是一个对象,但我只想获取(在JSON中)在反序列化期间将像在类中那样传递。 如何使用Json.NET实现该目标? 我相信我可以使用CustomJsonConverter完成它。但是我很困惑。docs中的示例仅用于,但不适用。 问题答案: 我只是使用上面在问题中提到的方法解决了我的问题。在我完整的代码下