如何反序列化派生类

前言

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

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

假设有一个 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…

哪位大兄弟有用 cMake 开发Android ndk的

一直用 Android studio 开发ndk&#xff0c;但是gradle支持的不是很好&#xff0c;只有experimental 版本支持 配置各种蛋疼。主要每次新建一个module都要修改配置半天。之前也看到过google 开发文档有提到 cmake 但是一直没用。哪位大兄弟用过&#xff0c;说下经验 哪位大兄弟…

restfull知识点

网络应用程序&#xff0c;分为前端和后端两个部分。当前的发展趋势&#xff0c;就是前端设备层出不穷&#xff08;手机、平板、桌面电脑、其他专用设备......&#xff09;。因此&#xff0c;必须有一种统一的机制&#xff0c;方便不同的前端设备与后端进行通信。这导致API构架的…

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

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

WPF-18 INotifyPropertyChanged 接口

我们先来看看微软官方给出的定语&#xff1a;通知客户端属性值已经更改。其实对于一个陌生小白来说&#xff0c;很难通过这句话来理解其中的原理&#xff0c;这个接口在WPF和Winform编程中经常会用到&#xff0c;下面是该接口的定义&#xff1a;namespace System.ComponentMode…

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

头脑风暴 软件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;感兴趣的朋…

使用 System.Text.Json 时,如何处理 Dictionary 中 Key 为自定义类型的问题

在使用 System.Text.Json 进行 JSON 序列化和反序列化操作时&#xff0c;我们会遇到一个问题&#xff1a;如何处理字典中的 Key 为自定义类型的问题。背景说明 例如&#xff0c;我们有如下代码&#xff1a;// 定义一个自定义类型 public class CustomType {public int Id { get…

极限编程 (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计算机正面临网络攻击威胁。 上周&…

Nginx、LVS及HAProxy负载均衡软件的优缺点详解

转自&#xff1a;https://www.csdn.net/article/2014-07-24/2820837 摘要&#xff1a;Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件&#xff0c;一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术&#xff0c;具体的应用需求还得具体分析&…

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;进而介绍了云计算的发展史。从云计算诞生的初衷以及现在流行的分布式应用又延伸…

如何在vue中使用sass

安装sass 安装教程链接&#xff1a; https://www.sass.hk/install/ 在vue中使用sass 参考链接&#xff1a; https://www.jianshu.com/p/8e60048baeb7 打开控制台&#xff1a;输入命令行 如果是没有淘宝镜像的&#xff0c;先下载淘宝镜像&#xff0c;之后的下载速度比较快 npm i…

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 生态&…