大家好,我是沙漠尽头的狼。

一. 问题描述

如下图,定义两个子类Student和Employ,都继承自抽象类PersonBase:

public abstract class PersonBase
{
public string Name { get; set; } protected PersonBase(string name)
{
Name = name;
}
} public class Student : PersonBase
{
public string Number { get; set; } public Student(string name, string number) : base(name)
{
Number = number;
}
} public class Employ : PersonBase
{
public string CompanyName { get; set; } public Employ(string name, string companyName) : base(name)
{
CompanyName = companyName;
}
}

添加Web API接口返回基类集合:

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
[HttpGet(Name = "GetDetails")]
public IEnumerable<PersonBase> Get()
{
return new List<PersonBase>()
{
new Student("学生A", "学生号01"),
new Employ("职员01", "百度")
};
}
}

接口返回值:

[
{
"name": "学生A"
},
{
"name": "职员01"
}
]

发现问题了吗?Student类和Employ类实例的扩展属性(Student的Number属性,Employ的Company属性)都未被序列化展示,那么怎么序列化子类的所有属性呢?

二、实现类的所有属性序列化

参考微软文档《如何使用System.Text.Json序列化派生类的属性》,有两种实现方式站长觉得比较简单。

2.1、.NET 7之前的实现方式

在 .NET 7 之前的版本中,System.Text.Json 不支持多态类型层次结构的序列化。 例如,如果接口的返回值类型为接口或抽象类集合,那么即使运行时类型具有其他属性,也只会序列化对接口或抽象类定义的属性。

解决方案:将接口返回值由IEnumerable<PersonBase>改为object,接口实现的List<PersonBase>改为List<object>:

[HttpGet(Name = "GetDetails")]
public object Get()
{
return new List<object>()
{
new Student("学生A", "学生号01"),
new Employ("职员01", "百度")
};
}

修改后,接口成功返回详细JSON信息:

[
{
"number": "学生号01",
"name": "学生A"
},
{
"companyName": "百度",
"name": "职员01"
}
]

原理: 改为Object后,默认就是对实现类进行序列化了,改之前System.Text.Json只认识实现类的爸爸。

2.2、.NET 7及以后的实现方式

从 .NET 7 开始,System.Text.Json 支持使用特性标注的多态类型层次结构序列化和反序列化。

我们将接口恢复,在抽象类上添加特性,标明基类序列化时需要映射的子类类型:

[JsonDerivedType(typeof(Student))]
[JsonDerivedType(typeof(Employ))]
public abstract class PersonBase

问题解决,接口返回值同上。

文档关于JsonDerivedTypeAttribute的描述:当放置在类型声明中时,则指示应选择指定的子类型进行多态序列化。 它还公开用于指定类型鉴别器的功能。

三、总结

上面两种方式看.NET版本选择,第二种方式需要您明确知道子类类型,详细使用请看微软文档:如何使用System.Text.Json序列化派生类的属性

如果您有更好的方式欢迎留言探讨。

Web API接口返回实现类集合的姿势了解的更多相关文章

  1. Web Api 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 WebApi 接口参数:传参详解,这篇博文内容本身很基础 ...

  2. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...

  3. C# 请求Web Api 接口,返回的json数据直接反序列化为实体类

    须要的引用的dll类: Newtonsoft.Json.dll.System.Net.Http.dll.System.Net.Http.Formatting.dll Web Api接口为GET形式: ...

  4. Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口

    1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...

  5. Web API接口设计经验总结

    在Web API接口的开发过程中,我们可能会碰到各种各样的问题,我在前面两篇随笔<Web API应用架构在Winform混合框架中的应用(1)>.<Web API应用架构在Winfo ...

  6. Web API接口设计(学习)

    1.在接口定义中确定MVC的GET或者POST方式 由于我们整个Web API平台是基于MVC的基础上进行的API开发,因此整个Web API的接口,在定义的时候,一般需要显示来声明接口是[HttpG ...

  7. WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递

    回到目录 上一讲中介绍了使用HttpClient如何去调用一个标准的Web Api接口,并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对 ...

  8. Web API接口 安全验证

    在上篇随笔<Web API应用架构设计分析(1)>,我对Web API的各种应用架构进行了概括性的分析和设计,Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端 ...

  9. 微信小程序的Web API接口设计及常见接口实现

    微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们 ...

  10. 01 web api接口

    WEB API接口 接口介绍 接口概念:前台与后台进行信息交互的媒介 - url连接 https://api.map.baidu.com/place/v2/search 接口组成: url链接 - 长 ...

随机推荐

  1. Java并发(二十一)----wait notify介绍

    1.小故事 - 为什么需要 wait 由于条件不满足(没烟干不了活啊,等小M把烟送过来),小南不能继续进行计算 但小南如果一直占用着锁,其它人就得一直阻塞,效率太低 于是老王单开了一间休息室(调用 w ...

  2. 使用容器快速在阿里云 ECS 多节点上搭建 Citus 12.1 集群

    阿里云 ECS 机器节点 这里我们使用两台同一区域的 ECS 机器. 机器配置:2 核 2 G.(ps: 阿里云 99 元一年的活动) 一台安装 coordinator(协调器),这里内网 IP 为 ...

  3. Android SDK Manager 报错“加载 SDK 组件信息失败”。(Android SDK Manager complains with "Loading SDK component information failed."

    [解决方案]: 将存储库设置更改为 Google .因此,在 android SDK 管理器上点击齿轮图标(设置),然后点击 Repository -> Google.

  4. 报错信息如下:出现身份验证错误。要求的函数不受支持。可能是由于CredSSP加密数据库修正。

    微软官方已出补丁包:CVE-2018-0886 的 CredSSP 更新 Windows Server 2016, all editions.Windows Server 2012 R2 Standa ...

  5. Spring Boot结合Element UI前后端分离的aixos的简单操作

    1:axios是什么? 基于promise用于浏览器和node.js的http客户端 axios官网:http://www.axios-js.com/  2:准备工作: 安装axios:npm ins ...

  6. 动态规划问题(三)最长递增子序列长度(LIS)

    问题描述 ​ 有一个数组,它内部的顺序是乱序的,现在要求你找出该数组中的最长的递增子序列长度. ​ 例如:对于数组 {10, 20, 9, 33, 21, 50, 41, 60, 80},它的最长递增 ...

  7. WinDbg实践--入门篇

      WinDbg从字面意思就是Windows+Debug的组合,即Windows平台上的调试工具,可以调试用户模式.内核模式.dump文件等,总之知道它的调试功能非常强大就行了.WinDbg调试命令分 ...

  8. Xshell与Xftp安装与使用

    Xshell与Xftp安装 软件安装:官网或者应用商店 安装结束 nslicense.dll替换 下载文件 使用 登录 双击刚刚建立的连接 表示建立成功 点击文件传输 右边就是服务器的文件,左边就是本 ...

  9. 面试官让列举Spring的事务会失效的场景,我说了8个

    本文分享自华为云社区<哪些场景下Spring的事务会失效?>,作者:冰 河 . 在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题.而针对Spri ...

  10. 云图说|将源端MongoDB业务搬迁至华为云DDS的几种方式

    摘要:华为云文档数据库服务DDS能帮您在业务需要时,快速便捷的搬迁源端MongoDB业务上云. 如果您因业务调整或需要使用华为云文档数据库DDS特性功能时,可以通过数据迁移功能将原有MongoDB数据 ...