如何反序列化派生類

前言

上回,我們講解了《如何序列化派生類》。

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

假設有一個 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.pswp.cn/news/280354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280354.shtml
英文地址,請注明出處:http://en.pswp.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 生態&…