将JSON反序列化为多个继承类

2024-04-15

当我从 DocumentDB 序列化 JSON 对象时,我的Control没有反序列化到OptionsControlOptions财产。

我有以下课程,Control:

public class Control : IControl
{
    public Guid Id { get; set; }

    public virtual Enums.ControlType Type { get; set; }

    public string PropertyName { get; set; }

    public string ControlCssClass { get; set; }

    public string Description { get; set; }
}

我也有OptionsControl,它继承自Control:

public class OptionsControl : Control
{
    public IDictionary<string, string> Options;
}

我也有一个ClickableControl:

public class ClickableControl : Control
{
    public string Url { get; set; }
    public string UrlTarget { get; set; }
}

我使用 Azure 中的文档资源管理器将此 JSON 放入document在文档数据库中collection:

Rows:
[
    {
        Controls:
        [
            {
              "PropertyName": "Relationship",
              "ControlCssClass": "",
              "Description": "",
              "Type": 3,
              "Options": [
                  {
                    "Key": "Spouse",
                    "Value": "Spouse"
                  },
                  {
                    "Key": "Child",
                    "Value": "Child"
                  },
                  {
                    "Key": "Step-child",
                    "Value": "Step-child"
                  }
              ],
           }
        ]
    }
]

当我从 DocumentDB 中提取数据时,我尝试将其序列化到我的Row class:

public class Row
{
    public IList<Control> Controls { get; set; }
}

我需要能够将任何类型的“Control”放入 DocDB 的控制列表中,并让 C# 将该列表反序列化回正确的位置Control类(是基类Control类,或衍生物之一,如OptionsControl or ClickableControl).

问题是因为我反序列化成Control,我获得了控件上的所有属性,除了Options。或者如果我尝试反序列化一个Url and UrlTarget,我只获取基本 Control 属性而不是 URL 属性。我认为 C# 会处理将反序列化对象转换为 OptionsControl 或 ClickableControl,但我想这是不正确的?我需要做什么才能使 DocumentDB 中的 JSON 对象正确序列化并变成OptionsControl(具有选项属性)而不仅仅是基本控件?


您可以尝试使用 Json.NET 自行序列化对象,然后将序列化内容发布到 DocumentDb 中。然后,当您需要数据时,将其作为 json 字符串读回并再次使用 Json.NET 进行反序列化。 Json.NET 可以处理继承,因此您只需将其配置为了解类型层次结构即可。使用 TypeNameHandling 设置:

http://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm http://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将JSON反序列化为多个继承类 的相关文章

随机推荐

  • jQuery UI 日期选择器导致屏幕在选择日期后滚动到顶部

    我在 jQuery 对话框中有几个 jQuery 日期选择器 每当用户从日期选择器中选择日期时 屏幕就会滚动到顶部 这种情况只发生在 IE8 中 而不会发生在 Firefox 3 6 或 Chrome 5 中 由于大多数用户都会使用 IE
  • 如何在 CloudKit 中撤销用户的可发现性权限?

    我很好奇用户是否可以以某种方式更改可发现性权限 我在设置里没找到方法 您可以在您的设备上进行设置Settings iCloud iCloud Drive Find via Email
  • jenkins 擦除存储库并强制克隆与结帐前清理

    我试图了解用于拉取 git 存储库的 擦除存储库并强制克隆 和 签出前清理 这两个选项之间的区别 查看这两个选项的帮助部分 两者似乎都有相似的功能 我无法找出区别 它们的外观如下 清除存储库并强制克隆 在构建之前删除工作区的内容 确保工作区
  • 使用node.js os.cpus()来检测用户空闲时间?

    我正在使用 appjs 开发一个聊天应用程序 该应用程序使用 node js 作为平台 我一直在检测计算机何时处于空闲状态 当用户离开它或不使用它时 Node js 中有 os 模块及其os cpus 为每个核心提供此类信息 model I
  • 如何在不更改原始列表的情况下更改新列表?

    我有一个列表 其中填充了操作中的一些数据 并将其存储在内存缓存中 现在我想要另一个列表 其中包含基于某些条件的列表中的一些子数据 正如下面的代码所示 我正在对目标列表进行一些操作 问题是我对目标列表所做的任何更改也会对 mainList 进
  • 如何防止用户在文本框中输入特殊字符[重复]

    这个问题在这里已经有答案了 我需要验证文本框中的密码条目 我有一些要求需要满足 以便允许创建用户配置文件 其中之一是如果密码包含除数字和字母以外的任何其他内容 则拒绝注册系统需要拒绝进入 我尝试的一切似乎都失败了 这就是我现在站的地方 pr
  • 编译 eigen 程序时出错:错误:'seq' 不是 'Eigen' 的成员

    我试图在遵循算术序列的索引中索引矩阵 根据官网的Eigen教程 我应该使用Eigen seq firstVal lastVal step 来生成这个序列 调用此函数后 会弹出该线程标题中粘贴的错误 我检查了本地 eigen 文件夹中的所有文
  • 如何在 python-docx 中获取单元格背景颜色?

    我正在尝试使用 python docx 从 MS Word 表中读取数据 有一种方法可以设置表格单元格的背景颜色 tcPr cell tc get or add tcPr shd OxmlElement w shd shd set qn w
  • 扩展 ASP.NET 应用程序

    这是一个非常广泛的问题 但希望我能得到有用的提示 目前我有一个在单个服务器上运行的 ASP NET 应用程序 我现在需要进行扩展以适应不断增加的客户负载 所以我的计划是 1 将 ASP NET 和 Web 组件扩展到五台服务器上 2 将数据
  • 用scrapy一一爬取网站列表

    我正在尝试抓取网站列表scrapy 我尝试将网站网址列表作为start urls 但后来我发现我买不起那么多内存 有什么办法可以设置scrapy一次抓取一两个网站 您可以尝试使用concurrent requests 1以免数据超载 htt
  • 如何在java服务器端解密cryptojs AES加密消息?

    我有以下基于 cryptojs 的 javascript 加密 解密函数 它工作得很好 我在使用 cryptpjs 加密消息时使用随机盐 随机 iv 值和特定密码 我在解密加密消息时重复使用相同的盐 iv 和密码来生成密钥 这部分效果很好
  • 如何在odoo 10中添加、更新和删除Many2many字段记录?

    我正在向导中设置功能 该功能将执行以下操作 添加新记录并链接到当前现有记录Many2many Field 更新现有记录Many2many Field 删除当前已有的Many2many场地 向导模型和实际模型有两个Many2many fiel
  • 使用Android Studio和gradle时是否可以在项目之间共享库项目?

    我正在努力弄清楚如何将库项目导入到 Android Studio 中 以使其可用于多个项目 新构建系统的文档意味着您需要将库项目导入到您正在处理的项目的根目录中 Gradle 项目还可以通过使用多项目设置来依赖于其他 gradle 项目 多
  • Windows 7下PostgreSQL pg_ctl注册错误

    在 Windows 7 PostgreSQL 9 3 2 下 我尝试使用不同的端口号和数据目录将同一服务器上的第二个 PostgreSQL 实例注册为服务 使用 initdb 命令在 C Program Files PostgreSQL 9
  • 无法在 log4j 中将 MaxFileSize 设置为值“100MB”

    我使用 log4j1 2 17 和 apache extras log4j 1 2 17 jar 进行日志记录 我的目的是根据大小滚动和归档文件 下面是 log4j xml
  • 使用Python在国家地图上绘制数据的最简单方法

    无法删除问题 请参考问题 使用底图根据字典值对国家 地区的州进行着色 https stackoverflow com questions 36118998 shade states of a country according to dic
  • 如何在 Django admin 中向第三方、外部 jQuery 插件提供 $

    我在 Django 管理基本模板中包含了几个第三方 jQuery 插件 这些插件假定 可用 对于我自己的代码 我一直很乐意这样做 function my code here django jQuery 但是我如何向外部文件中其他人的代码提供
  • 在溢出的情况下,i++ 是否会调用小于 int 的有符号类型的未定义行为?

    显然 以下代码由于算术溢出而调用未定义的行为 include
  • iOS 7 替代 CTCall?

    在我们的企业 iOS 应用程序中 我们使用 CTCallRef CTCallDial CFStringRef number 从应用程序拨打电话 并且能够隐藏来电显示 它似乎在 iOS 7 中不起作用 API 是否已更改 我完全知道这是一个私
  • 将JSON反序列化为多个继承类

    当我从 DocumentDB 序列化 JSON 对象时 我的Control没有反序列化到OptionsControl与Options财产 我有以下课程 Control public class Control IControl public