我有两个“数据”类:
public class BaseData
{
public string BaseDataStuff { get; set; }
}
public class ChildData : BaseData
{
public string ChildDataStuff { get; set; }
}
和“容器”类:
public class Container
{
public BaseData Data { get; set; }
}
型
然后我有下面的控制器:
public class Controller : ControllerBase
{
private readonly ChildData Data;
private readonly Container Container;
public Controller()
{
Data = new ChildData()
{
BaseDataStuff = "base stuff",
ChildDataStuff = "child stuff"
};
Container = new Container()
{
Data = Data
};
}
[HttpGet("data")]
public ActionResult<BaseData> GetData() => Ok(Container.Data);
[HttpGet("container")]
public ActionResult<Container> GetContainer() => Ok(Container);
}
第一个方法只返回ChildData
示例,当我 swagger 地运行它时,我得到了我所期望的JSON:
{
"childDataStuff": "child stuff",
"baseDataStuff": "base stuff"
}
当我通过swagger运行第二个方法时,它看起来像是将ChildData
示例转换为BaseData
。
{
"data": {
"baseDataStuff": "base stuff"
}
}
有人能解释一下这里发生了什么吗?
2条答案
按热度按时间njthzxwz1#
这个问题很有趣。请参见How to serialize properties of derived classes with System.Text.Json
在那里,它解释了System.Text.Json在.NET 7之前没有按照您想要的方式处理多态对象的序列化。有一些变通方法,但这些方法允许您在根对象是多态(在您的情况下是容器)但不是根的成员(BaseData和ChildData)时进行序列化。
在.NET 7中,您可以这样做
以及
以及
然后这个
给你
我想这正是你想要的。当然,去。NET 7可能不太方便。
bmp9r5qi2#
您可以尝试将自己序列化为like this
或者另一种选择,就是显式地将它们标记为对于序列化程序是可序列化的: