json 如何返回< BaseClass>具有子属性的列表?

33qvvth1  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(153)

如何从.NET 5控制器返回基类对象及其子类型属性的列表。

public class StepBaseDto 
{
    public string Title { get; set; }
    public int Order { get; set; }
    public StepType StepType { get; set; }
    public bool IsDone { get; set; }
    public string Description { get; set; }
    public string PropertyLabel { get; protected set; }
    public Guid ProtocolId { get; set; }
    public List<SubStepDto> SubSteps { get; set; }
}


public class StartDateStepDto : StepBaseDto
{
    public DateTime? StartingDate { get; set; }
}


public class ProtocolDto : ProtocolBaseDto
{
    public List<StepBaseDto > StepSequence { get; set; }
}

终点:

public override Task<ProtocolDto> GetAsync(Guid id)

在返回ProtocolDto及其StepBaseDto列表时,我无法在JSON结果中看到派生类的属性。
但是如果我改变了

public class ProtocolDto : ProtocolBaseDto
{
    public List<object> StepSequence { get; set; }
}

是否有方法可以在不将StepBaseDto更改为object的情况下实现相同的结果?
编辑:我正在使用自动Map器
我发现了一个与这个问题相关的问题:Derived type's properties missing in JSON response from ASP.NET Core API
但该解决方案对我不起作用,我使用的是ABP Framework 5.3.4
When using List
When using List

通过使用dynamic而不是基类修复了它

rekjcdws

rekjcdws1#

您看不到子类别属性,因为您说它是基底类别的清单。任何指涉该清单的程式码也会认为它们是基底类别。您可以:
1.使列表成为子类列表,或者
1.每次要访问那些子类属性时都要进行类型转换,或者
1.将子类属性移到接口并使用接口列表,或
1.将子类属性移到基类中。
我认为你遇到的问题是,如果你试图访问子类的属性,你实际上并不需要一个基类的列表。因为你的子类只是添加了一个可空属性,我认为你可以把它放在基类中,而不破坏任何东西--没有属性的对象将其保留为空,有属性的对象可以设置字段。
我不清楚你是如何尝试访问它的,它应该如何使用,等等,所以很难给予你更好的指导。

k97glaaz

k97glaaz2#

解决方案; Microsoft.Text.Json〈V6不支持多态性,我们必须使用Newtonsoft Json解析器。或者你必须切换到V7,这对我来说是不可能的。
完整说明如下:https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/polymorphism?pivots=dotnet-7-0
他们强迫我们使用Object或者切换回Newtonsoft

编辑:一个好的解决方法是使用dynamic而不是基类

相关问题