• 我的订阅
  • 科技

C#如何反序列化派生类

类别:科技 发布时间:2022-12-19 02:02:00 来源:戴维斯骑士

假设有一个 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();

}

C#如何反序列化派生类

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

思路

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

public class PersonConverter : JsonConverter

{

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()));

运行,反序列化成功:

C#如何反序列化派生类

结论

通过自定义转换器,我们实现了使用System.Text.Json反序列化派生类。返回搜狐,查看更多

责任编辑:

以上内容为资讯信息快照,由td.fyun.cc爬虫进行采集并收录,本站未对信息做任何修改,信息内容不代表本站立场。

快照生成时间:2022-12-19 05:39:43

本站信息快照查询为非营利公共服务,如有侵权请联系我们进行删除。

信息原文地址:

更多关于C#,序列的资讯:
微软发布c#开发套件:修复350多问题
...息,微软今年6月以预览版的形式,为VisualStudioCode发布了C#开发套件,在经过4个月的测试打磨之后,微软于今天正式发布该开发套件
2023-10-07 01:28:00
C# 发布 | 历史上的今天
...ladin: Sword and Fairy。资料来源:维基百科2000 年 7 月 7 日:C# 发布图源:维基百科2000 年 7 月 7 日
2023-07-08 04:00:00
微软免费Windows 11虚拟机 支持C#开发
...些工具包括:已启用USP、.NET桌面、Azure和Windows App SDK for C#等工作负载的Visual Studio 2022社区版
2023-06-28 07:00:00
C# 最有可能摘得“年度编程语言”,Python、Java 正在让位,TIOBE 12 月编程语言榜单最新预测来了!
...名第 50 位的编程语言2023 年 12 月排名第 50 位的编程语言C# 最有可能成为年度编程语言?当论及谁最有可能会成为 2023 年年度编程语言
2023-12-11 16:02:00
2023 年需求最大的 8 款编程语言出炉
....6万份工作机会,占比约为17%。▲图源 DevJobsScanner网站4、C# ▲图源C#的图标C#排名第四
2023-07-22 19:04:00
微软为vscode推出c#devkit改善开发体验
6月8日消息,微软今天面向VisualStudioCode发布了C#DevKit,在 Win10、Win11、macOS和Linux发行版上
2023-06-08 21:41:00
2022 年需求最大的 8 种编程语言
...许多顶级公司使用的Spring等框架正在帮助保持它的地位。C#第四名是 C# 。C# 是一种通用的、多范式的、面向对象的编程语言
2022-12-19 10:00
中铁建工汉峪金融商务中心B01地块综合楼二标段项目首栋封顶
...限公司承建的汉峪金融商务中心B01地块综合楼二标段项目C#楼主体结构顺利封顶,为工程如期建成投用奠定了基础。济南高新控股集团有限公司、营特国际工程咨询集团有限公司、中铁建工集
2023-05-29 11:34:00
微软招聘rust精兵强将加入新团队
...备大规模服务开发经验,并精通Microsoft365云服务的Rust和C#编程语言。招聘信息写道:“我们正在组建一支全新的团队
2024-01-30 04:14:00
更多关于科技的资讯: