如何反序列化派生类

前言

上回,我们讲解了《如何序列化派生类》。

那如何反序列化派生类呢?

假设有一个 Person 抽象基类,其中包含 Student 和 Teacher 派生类:

public class Person
{public string Name { get; set; }
}public class Student : Person
{public int Score { get; set; }
}public class Teacher : Person
{public string Title { get; set; }
}

如果 API 输入类型是单个 Person 抽象基类,即使我们传入正确格式的派生类 JSON 字符串,System.Text.Json也只会使用基类进行反序列化:

[HttpPost]
[Route("get")]
public string Get(Person person)
{return person.GetType().ToString();
}

8211d0102aebc51585c56cb25ba85c32.png

我们必须主动告诉System.Text.Json如何处理反序列化派生类,因此需要自定义转换器。

思路

与序列化相反,我们需要实现自定义转换器的Read方法:

public class PersonConverter : JsonConverter<Person>
{public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){}
}

现在的关键是,如何判断到底要反序列化成哪个派生类型。

我们可以使用Read方法遍历 JSON 的所有 Property, 找到对应派生类型独有的属性,即可知道当前需要反序列化成哪个派生类型。

实现

为基类创建自定义转换器,实现Read方法:

public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{Utf8JsonReader readerClone = reader;while (readerClone.Read()){JsonTokenType tokenType = readerClone.TokenType;switch (tokenType){case JsonTokenType.PropertyName:if (readerClone.ValueTextEquals("score")){return (Person)JsonSerializer.Deserialize(ref reader,typeof(Student), options);}else if (readerClone.ValueTextEquals("title")){return (Person)JsonSerializer.Deserialize(ref reader, typeof(Teacher), options);}break;}}throw new NotImplementedException();
}

因为 Utf8JsonReader 是只进读取器,因此这里需要创建 Utf8JsonReader 实例的克隆readerClone去遍历 JSON,而原始 reader 用于反序列化派生类。

然后修改 Startup.cs 文件,注册自定义转换器:

services.AddControllers().AddJsonOptions(options =>options.JsonSerializerOptions.Converters.Add(new PersonConverter()));

运行,反序列化成功:

5d631ddcdd826ac7f06e7752f95582cd.png

结论

通过自定义转换器,我们实现了使用System.Text.Json反序列化派生类。

添加微信号【MyIO666】,邀你加入技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标跟踪 facebook_如何关闭Facebook Messenger的位置跟踪(如果已启用)

目标跟踪 facebookIt seems like everyone is tracking our location now. Not surprisingly, Facebook Messenger can also transmit a significant amount of information on your location activity. If you use Messenger, here’s how to make sure it’s not reporting y…

云计算基础知识:CPU虚拟化

虚拟化技术的分类主要有服务器虚拟化、存储虚拟化、网络虚拟化、应用虚拟化。服务器虚拟化技术按照虚拟对象来分&#xff0c;可分为&#xff1a;CPU虚拟化、内存虚拟化、I/O虚拟化;按照虚拟化程度可分为&#xff1a;全虚拟化、半虚拟化、硬件辅助虚拟化。将不同的虚拟化对象和程…

头脑风暴 软件_头脑风暴和思维导图的最佳网站和软件

头脑风暴 软件A mind map is a diagram that allows you to visually outline information, helping you organize, solve problems, and make decisions. Start with a single idea in the center of the diagram and add associated ideas, words, and concepts connected ra…

NULL的陷阱:Merge

NULL表示unknown&#xff0c;不确定值&#xff0c;所以任何值&#xff08;包括null值&#xff09;和NULL值比较都是不可知的&#xff0c;在on子句&#xff0c;where子句&#xff0c;Merge或case的when子句中&#xff0c;任何值和null比较的结果都是false&#xff0c;这就是NULL…

Python实现将不规范的英文名字首字母大写

Python实现将不规范的英文名字首字母大写 这篇文章给大家主要介绍的是利用map()函数&#xff0c;把用户输入的不规范的英文名字&#xff0c;变为首字母大写&#xff0c;其他小写的规范名字。文中给出了三种解决方法&#xff0c;大家可以根据需要选择使用&#xff0c;感兴趣的朋…

极限编程 (Extreme Programming) - 发布计划 (Release Planning)

编写用户故事后&#xff0c;您可以使用发布计划会议来创建发布计划。发布计划指定 将为每个系统版本实现哪些用户故事以及这些版本的日期。这给出了一组用户故事供客户在迭代计划会议期间进行选择&#xff0c;以便在下一次迭代期间实施。然后将这些选定的故事翻译成单独的编程任…

使用Ubuntu的公用文件夹轻松地在计算机之间共享文件

You’ve probably noticed that Ubuntu comes with a Public folder in your home directory. This folder isn’t shared by default, but you can easily set up several different types of file-sharing to easily share files on your local network. 您可能已经注意到&am…

NSA泄露的恶意软件DoublePulsar感染了数万台Windows电脑

本文讲的是NSA泄露的恶意软件DoublePulsar感染了数万台Windows电脑&#xff0c;安全研究人员认为&#xff0c;世界各地的脚本小子和在线犯罪分子正在利用Shadow Brokers 黑客组织上周泄露的NSA黑客工具&#xff0c;致使全球数十万台Windows计算机正面临网络攻击威胁。 上周&…

windows下使用nginx调试简介

安装使用 nginx是一个反向代理服务器&#xff0c;在web开发调试中经常用到&#xff0c;写一个简单的使用说明和总结。 1. 下载 点击官网下载地址 下载对应版本的nginx并解压 2. 配置 在解压的目录下找到conf/nginx.conf文件添加所需监听和代理的server # 项目名称server {liste…

MASA Framework 命令查询职责分离

概念CQRS (https://learn.microsoft.com/zh-cn/azure/architecture/patterns/cqrs)是一种与领域驱动设计和事件溯源相关的架构模式, 它的全称是Command Query Responsibility Segregation, 又叫命令查询职责分离, Greg Young在2010年创造了这个术语, 它是基于Bertrand Meyer 的…

Google的Project Stream准备在Chrome中播放AAA控制台游戏

Streaming full 3D games over a high-speed web connection is a fast growing trend. And with ridiculous amounts of infrastructure and remote computing power, Google is well equipped to join it. 通过高速网络连接流式传输完整的3D游戏是一种快速增长的趋势。 凭借可…

私有云之迷思:未来是什么?

本文讲的是私有云之迷思&#xff1a;未来是什么&#xff1f;&#xff0c;【编者的话】非常好的一篇文章&#xff0c;作者从OpenStack目前的困境讲起&#xff0c;聊到了私有云的产生背景&#xff0c;进而介绍了云计算的发展史。从云计算诞生的初衷以及现在流行的分布式应用又延伸…

maven项目的目录结构

1、maven项目采用“约定优于配置”的原则&#xff1a; src/main/java&#xff1a;约定用于存放源代码&#xff0c;src/test/java&#xff1a;用于存放单元测试代码&#xff0c;&#xff08;测试代码的包应该和被测试代码包结构保持一致&#xff0c;方便测试查找&#xff09;src…

AWS大力支持.NET 开源项目,和Azure抢.NET 客户

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013)在 2022 re:Invent 会议上&#xff0c; AWS 软件开发经理 Saikat Banerjee 锐评道&#xff1a;” 我们发现 .NET 开源项目资金严重不足&#xff0c;仍可称之为第三方开源”。随即表示 AWS 过去非常重视 .net 生态&…

攻防 logmein_如何使用LogMeIn Hamachi在任何地方访问文件

攻防 logmeinWhether you’re at work and forgot some file on your home computer, want to play some music on a train, or just want to move some files between your computers, accessing your files from anywhere is a life saver. 无论您是在工作时忘记了家用计算机…

在FC中如何获取fcdot文件

在FlexiCapture中一些客户在问如何获取.fcdot文件(在测试序列号下或者没有测试模板的情况下) 第一步&#xff1a; 1、查看License Manager查看是否找到序列号 首先我们在开始菜单里面打开ABByyFlexiCapTure11——》选择"工具"下的License Manager 第二步 1、选择管理…

Blazor学习之旅 (9) 用MudBlazor重构Todo

【Blazor】| 总结/Edison Zhou大家好&#xff0c;我是Edison。在之前的学习之旅&#xff08;3&#xff09;开发一个Todo应用中&#xff0c;我们开发了一个简单版的Todo&#xff0c;这次我们基于MudBlazor来重构这个Todo应用。Todo V1回顾在Blazor入门学习&#xff08;3&#xf…

50多种在Photoshop中删除图像背景的工具和技术,第3页

We’re completing the 50 Tools and Techniques today with this final installment. Read about advanced selection and masking tools, as well as some stupid graphics geek tricks, and ways to fake removing a background in seconds. 我们今天最后一部分将完成50多种…

开源的 .NET 数据库迁移框架

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具和组件&#xff0c;希望对您有用&#xff01;简介FluentMigrator 是一个开源的数据库迁移框架&#xff0c;可以帮助用户在开发过程中保持数据库的一致性。它提供了一个简洁的 Flue…

2015年IT领域里Docker和其它颠覆性的趋势

本文讲的是2015年IT领域里Docker和其它颠覆性的趋势&#xff0c;【编者的话】文中作者介绍了2015年IT领域的一些颠覆性的趋势&#xff0c;比如Docker将如何革新PaaS、IaaS等&#xff0c;Docker将如何颠覆虚拟化、私有云、配置管理。 2014年真是令人兴奋的一年&#xff0c;这一年…