【问题标题】:ASP.NET Core casts properties to base classASP.NET Core 将属性转换为基类
【发布时间】:2022-12-08 02:52:14
【问题描述】:

我有两个“数据”类:

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 实例。当我大摇大摆地运行它时,我得到了我期望的 JSON:

{
  "childDataStuff": "child stuff",
  "baseDataStuff": "base stuff"
}

当我通过 swagger 运行第二种方法时,看起来它将 ChildData 实例转换为 BaseData。我得到以下 JSON:

{
  "data": {
    "baseDataStuff": "base stuff"
    }
}

有人可以解释这里发生了什么吗?

【问题讨论】:

  • public BaseData Data { get; set; }
  • @RomanRyzhiy,那又怎样?运行时类型不就是Data Child Data吗?
  • System.Text.JsonJsonSerializer.Serialize是这样工作的,Newtonsoft.Json是正常工作的。
  • @RomanRyzhiy 知道如何让它按我想要的方式工作吗?即序列化为ChildData。
  • 这取决于您的 Web 服务器的构建方式。但那将是极其错误的。只是一个小问题:假设你有一个“正确的”json,在“数据”部分有两个字段,你期望这个var container = JsonConvert.DeserializeObject&lt;Container&gt;(jsonStr);的结果是什么?

标签: c# .net asp.net-core asp.net-core-webapi


【解决方案1】:

你可以尝试自己连载like this

options = new JsonSerializerOptions
{
    WriteIndented = true
};
jsonString = JsonSerializer.Serialize<object>(Container, options);

或者另一种选择,是将它们显式标记为序列化程序的可序列化:

  [DataContract]
  public class BaseData
  {
    [DataMember]
    public string BaseDataStuff { get; set; }
  }

  [DataContract]
  public class ChildData : BaseData
  {
    [DataMember]
    public string ChildDataStuff { get; set; }
  }

【讨论】:

  • 当然两者都不起作用,因为它只影响根对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
相关资源
最近更新 更多