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

2023-12-21

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

public IThingy Thing

会产生错误:

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

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

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

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


@SamualDavis 提供了一个很好的解决方案相关问题 https://stackoverflow.com/questions/2254872/using-json-net-converters-to-deserialize-properties,我将在这里总结一下。

如果您必须将 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; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JSON.NET 中转换用于反序列化的接口 的相关文章

  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐

  • Monte Carlo pi 近似的并行化

    我正在编写一个 C 脚本来与 OpenMp 并行化 pi 近似 我认为我的代码运行良好 输出令人信服 我现在用 4 个线程运行它 我不确定的是 这段代码是否容易受到竞争条件的影响 如果是 我如何协调这段代码中的线程操作 代码如下 inclu
  • 在 iTextSharp 中的两个表格之间添加空格

    正如标题所示 我正在使用 iTextSharp 生成报告 我想在两个表之间添加一个空格 但我不知道如何做 这是我的代码 var boldFont FontFactory GetFont FontFactory HELVETICA BOLD
  • 将字符串转换为 JSON 数组

    我有来自 Web 服务的以下 JSON 字符串 并尝试将其转换为JSONarray locations lat 23 053 long 72 629 location ABC address DEF city Ahmedabad state
  • Firefox JavaScript chrome 代码中的弱引用

    假设我正在写一个类A 在我基于 Jetpack 的库中 即我们正在讨论 chrome 扩展代码 function A constructor A prototype class members 用户创建类的实例A var a new A 现
  • 如何将列数据转入不能超过最大数量总数的行?

    介绍 我遇到了意想不到的挑战 我希望有人可以提供帮助 并且我对根据这个问题操作数据的最佳方法感兴趣 设想 我需要合并与两个不同 ID 列关联的列数据 我的每一行都关联一个 item id 和该 item id 的数量 请参阅下面的示例 cu
  • 在没有互联网的情况下连接 WIFI 时,可达性需要太长时间才能失败

    你好呀 我一直在使用可达性类 一切正常 除了 当设备连接到 wifi 时 无论出于何种原因 wifi 路由器没有互联网连接 可达性等级需要很长时间才能表明没有互联网 当根本没有网络 互联网连接时 它工作得很好 很快 例如 如果 wifi 关
  • 数据库错误没有这样的表django

    我在 django 项目 cc 中创建了一个新应用程序 api 我有一个远程数据库 launchg 我使用 Legacies 将其与 Django 集成并使用python manage py inspectdb gt models py生成
  • Javascript 图像对象 - 处理 onload 事件

    我正在尝试在点击事件上预加载图像 new image object var imgObject new Image assign the path to the image to the src property imgObject src
  • 如何在 vuejs 中导入并使用本地 .csv 文件

    我在这个结构中有一个 csv 文件 name year href src Parasite 2019 parasite 2019 film poster 4 2 6 4 0 6 426406 parasite 0 460 0 690 cro
  • 使用 LIKE 表达式时 SQLite 中的土耳其语字符

    select from urunler where musteri like ir 测试数据 musteri ID rem 1 Kadir 2 Demir 3 返回结果 Kadir Demir if use r 然后伊雷姆回来了 但卡迪尔和
  • 如何在SDL2中旋转矩形?

    我计划制作一个游戏 并且我想为该游戏创建一些背景动画 这些动画之一是旋转矩形 我已经查看了所有内容 但找不到任何形式的数学或逻辑可以让我旋转矩形 具体来说是 SDL Rect 但您可能已经知道了 我自己无法计算出数学公式 我真的没有任何可用
  • 将所有远程 git 分支作为本地分支进行跟踪

    将单个远程分支作为本地分支进行跟踪非常简单 git checkout track b branch name origin branch name 将所有本地分支推送到远程 根据需要创建新的远程分支也很容易 git push all ori
  • 如何保守应用程序的秘密?

    每个新的 Play 应用程序都会在其配置文件中生成一个新的应用程序密钥 application secret asdfadsfdasf 我正在开发一个将部署在 Heroku 上的开源应用程序 如何保守应用程序的秘密 例如 不将其提交到源代码
  • Constexpr 用于创建对象

    我试图弄清楚使用以下命令创建对象是否会带来性能提升constexpr而不是正常情况下 这是代码片段constexpr class Rect const int a const float b public constexpr Rect co
  • TFS Online - 从 0 开始 $(Rev.r)

    我在内部版本号中使用 Rev r 主要 次要 修订版 r 这非常有效 并且在每次构建时都会递增 并且如果主要或次要版本发生更改 则会重置 但编号从 1 开始 而不是 0 所以第一个版本不是 1 0 0 而是 1 0 1 这并不是我真正想要的
  • Visual Studio 2010可以自动将编译后的文件复制到另一个目录吗?

    我有两个项目 一个是编译为 EXE 的 VB6 项目 另一个是编译为 DLL 的 MSVC 2010 项目 DLL 需要与 EXE 文件位于同一文件夹中才能工作 我可以让 Visual Studio 2010 在编译后自动将编译后的 DLL
  • 打字稿不创建 dist 文件夹

    尝试编写打字稿项目 这是我的项目结构 rootdir src server ts other folders node modules tsconfig json package json tsconfig json compilerOpt
  • Python vs Matlab - 为什么我的矩阵在 python 中是奇异的

    我正在尝试将一些算法从 Matlab 转换为 Python 3 8 在算法中 我试图反转一些矩阵 结果是Matlab按照它应该做的那样反转矩阵 但Python 使用numpy linalg 说它不能反转奇异矩阵 经过一番调试 我们发现在Ma
  • 为什么 UDF 比子查询慢这么多?

    我有一个情况 我需要翻译 查找 同一个表中的多个值 我编写的第一种方法是使用子查询 SELECT SELECT id FROM user WHERE user pk created by AS creator SELECT id FROM
  • 在 JSON.NET 中转换用于反序列化的接口

    我正在尝试设置一个阅读器 它将从各个网站获取 JSON 对象 想想信息抓取 并将它们转换为 C 对象 我目前正在使用 JSON NET 进行反序列化过程 我遇到的问题是它不知道如何处理类中的接口级属性 所以一些自然的东西 public IT