反序列化派生类时如何忽略基类 JsonConverter?

2023-12-01

我有一个抽象基类:

[JsonConverter(typeof(Converter))]
public abstract class TextComponent {
    ...
    public bool Bold { get; set; }
    public TextComponent[] Extra { get; set; }
    ...
}

还有更多继承自它的类。其中一门课是StringComponent:

public sealed class StringComponent : TextComponent
{
    public string Text { get; set; }

    public StringComponent(string text)
    {
        Text = text;
    }
}

Converter,这是一个JsonConverter应用于TextComponent看起来像这样:

private sealed class Converter : JsonConverter
{
    ....

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        var tok = JToken.Load(reader);
        switch (tok)
        {
            ...
            case JObject x:
                var dic = (IDictionary<string, JToken>) x;
                if (dic.ContainsKey("text")) return x.ToObject<StringComponent>();
                ...
            ...
        }
    }
    ...
    public override bool CanConvert(Type objectType) => objectType == typeof(TextComponent);
}

问题:

var str = "{\"text\":\"hello world\"}";
var obj = JsonConvert.DeserializeObject<TextComponent>(str);
// this doesn't work either:
var obj = JsonConvert.DeserializeObject<StringComponent>(str);

这进入无限“循环”,最终导致StackOverflow,因为调用时DeserializeObject<Stringcomponent> or ToObject<StringComponent>, the JsonConverter基类(Converter) 再次调用这些方法。这不是期望的行为。序列化派生类时,它们不应使用基类的JsonConverter。如果你看CanConvert的方法Converter,我也只允许它TextComponent仅适用于它的任何派生类。

那么我该如何解决这个问题呢?


可以将子类合约上的转换器设置为null;

    public override bool CanWrite => false;
    public override bool CanRead => true;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (objectType == typeof(BaseClass))
        {
            JObject item = JObject.Load(reader);
            if (item["isClass2"].Value<bool>())
            {
                return item.ToObject<ChildClass2>(serializer);
            }
            else
            {
                return item.ToObject<ChildClass1>(serializer);
            }
        }
        else
        {
            serializer.ContractResolver.ResolveContract(objectType).Converter = null;
            return serializer.Deserialize(reader, objectType);
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化派生类时如何忽略基类 JsonConverter? 的相关文章

  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op
  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 我在使用 PyVirtualDisplay==0.2.5 包运行使用虚拟显示器(无头模式)的测试时遇到问题

    我的测试正在按预期工作和运行PyVirtualDisplay 0 2 1 但我对该软件包的最新版本有疑问 例如 PyVirtualDisplay 0 2 5 我的代码片段 def set up self Creation of instan
  • 数据库:图像文件为 blob 还是文件路径?

    我知道这个问题已经被问过很多次了 I read this整篇文章 但仍然没有达到一个点 我正在制作一个网站 允许用户下载壁纸和歌曲 除了我之外 没有人会上传这些壁纸 歌曲 我的意思是说用户不会上传它们 现在 每个文件平均为 6Mb 歌曲 现
  • 当前上下文中不存在名称“sr”

    我正在遵循微软的例子site用于从文本文件中读取 他们说这样做 class Test public static void Main try using StreamReader sr new StreamReader TestFile t
  • Android:编译 9 补丁文件以在可绘制文件夹之外使用?

    我需要从可绘制文件夹外部加载 9 个补丁文件 例如 这样我的应用程序就可以从服务器下载新的皮肤 我发现在制作 apk 时 会编译存储在可绘制文件夹中的 9 补丁图像 从资产文件夹中读取的完全相同的文件没有 9 补丁块 因此 制作 apk 的
  • 将 X.509 证书从十六进制形式转换为 .cer 格式

    如何将 X 509 证书从十六进制转储形式转换为 CER 格式 此外 是否应该首先从十六进制转储中删除空格分隔符 谢谢 你可以使用ASN 1 编辑器 它有一个数据转换器 可以将 HEX 格式的数据转换为 PEM 格式的数据 源代码也可用 因
  • C# 解密加密文件时出现“Bad Data”异常

    嘿 我对加密和解密很陌生 说实话 甚至对 C 语言也很陌生 基本上 我有一个 TCP 聊天服务器 可以 保存 日志并加密文本文件 这就是我加密的方式 基于 MSDN 示例 public static void EncryptFile str
  • 使用mechanize登录megaupload

    我正在尝试使用以下代码登录megaupload 我的问题是 如何才能成功登录 我在代码末尾打印出当前的 URL 但是当我运行脚本时 它只返回 www megaupload com import mechanize import cookie
  • 检索和使用 tkinter 组合框选择

    我正在为一个定制计算器组装一个 GUI 它可以自动将某些测量单位转换为其他测量单位 我想返回所选的实际文本 以便我可以根据用户选择的任何内容编写 if 语句 如何让 python 返回实际值而不是我现在得到的值 每当我测试此代码时 我都会收
  • 为什么 AES 的不同实现会产生不同的输出?

    我觉得我对哈希函数及其所涉及的契约有很好的理解 输入 X 上的 SHA1 将始终产生相同的输出 您可以使用 Python 库 Java 库或笔和纸 它是一个函数 它是确定性的 我的 SHA1 与你的 Alice 和 Bob 的相同 据我了解
  • Oracle返回count的最高值

    为清楚起见进行了编辑 因此 我使用 Oracle SQL Developer 并设置了相当基本的数据库 我正在尝试计算两个合并列的重复项总数 并返回数量最高的字段 我使用的是 Oracle IDE 19 2 1 这是我到目前为止所拥有的 s
  • Azure DevOps Nuget 管道步骤中的 Nuget 包描述

    是否可以为 Azure DevOps Pipeline 中添加的 NuGet 包添加描述 Azure DevOps Nuget 管道步骤中的 Nuget 包描述 众所周知 当我们打包 nuget 包时 csproj文件 nuget将从文件中
  • 对于 Marshmallow 或更高版本中的窗口类型 2010,Android 权限被拒绝

    我正在尝试做Chathead类型过度绘制通过安卓服务在我的应用程序上 如下图所示 这个聊天头应用程序适用于 Android 版本 5 或更低版本 kitkat 棒棒糖等 但我在 Marshmallow 和更高版本中尝试它 然后收到此错误 a
  • 绘制图形在 VB.net 中消失

    我有一个简单的程序 您可以使用 FillEllipse 和 FillRectangle 在屏幕上绘制 我的问题是 当您将另一个窗口拖动到屏幕的一小部分时 该部分将被删除 当您将另一个窗口拖过 放开 然后将其拖回时 就会发生这种情况 有没有什
  • 在 Python 中使用 rarfile 从 RAR 存档中提取单个文件

    我有一个包含 2 个文件的 RAR 存档 但我只想提取一个 我在另一个答案中发现我可以使用rarfile包 根据文档包含extract功能 但是 当我尝试运行脚本时 我得到了FileNotFoundError WinError 2 以及以下
  • 在脚本中使用电子表格标准函数?

    当我编写脚本并想要使用标准函数时 例如WEEKNUM 这是否可以直接进行 或者我是否必须通过以下方式将公式触发到另一个字段 setFormula formula 然后读取相关单元格的内容 您描述的方法确实可行 但根本效率不高 因为它需要多次
  • 如何使用scikit线性回归模型同时求解多个独立时间序列

    我尝试使用 sklearn 线性回归模型同时预测多个独立时间序列 但我似乎无法正确预测 我的数据组织如下 Xn是一个矩阵 其中每行包含 4 个观测值的预测窗口 yn是每行的目标值Xn import numpy as np training
  • 登录 google firebase 帐户时出现错误 16 问题

    如您所见 这是我的代码 主要是从谷歌文档复制的 用于谷歌登录身份验证 问题是 当我单击登录按钮时 它会抛出一个名为 16 的错误 抱歉发布图像 我在发布代码时遇到问题 希望有人可以帮助我解决此问题 依赖关系 对于火力基地 implement
  • 收到“阅读器关闭时调用 Read 的尝试无效”

    我有以下代码 此处使用伪值以提高可读性 其中第一个连接返回大量数据 数千行 SqlDataReader 通过以下方式一一读取它们reader Read 然后打开一个新连接以使用新值更新每一行 using SqlConnection conn
  • 如何在 VB.NET 窗体的默认实例中调用方法而不是实例化另一个方法?

    当实例化的类调用父表单类中的方法时 VB NET 启动表单类的一个新实例 而不是调用活动实例的方法 我如何告诉它我只有一个表单类的实例 或者我不想创建表单的新实例而只想调用已经处于活动状态的表单上的方法 这是使用线程时的一个经典问题 表单实
  • 反序列化派生类时如何忽略基类 JsonConverter?

    我有一个抽象基类 JsonConverter typeof Converter public abstract class TextComponent public bool Bold get set public TextComponen