我正在将Web应用程序移植到ASP.NET Core 3,经过一番战斗之后,我几乎快要完成了。一切似乎都正常,但是从api返回的我的JSON数据突然缺少某些级别。
似乎options.JsonSerializerOptions.MaxDepth
的默认级别为64,所以可以是这样。在其他地方可以选择欺骗我的东西吗?
这是代码(和值的快速浏览):
这是我在浏览器中获得的JSON:
因此在生成的输出中完全缺少ParticipantGroups属性/集合。
有什么想法吗?
编辑:
我已经在Github上添加了一个回购来展示这个问题。从模板创建的标准ASP.NET Core 3.0解决方案,对Weatherforecast控制器返回的结果进行了更改:
答案 0 :(得分:1)
问题似乎是新版本3.0中的错误。至少对我来说这似乎是一个错误。
似乎System.Text.Json
将转换层次结构中提到的类,而不是实际的类。因此,如果您在层次结构中使用抽象类,则会遇到麻烦。第二个我删除了基类,并使用了我要返回的实际类,看来问题消失了。
所以这不起作用:
public class SurveyReportResult {
public Guid Id { get; set; }
public String Name { get; set; }
public Int32 MemberCount { get; set; }
public IEnumerable<OrganisationalUnit> OrganisationalUnits { get; set; }
}
public abstract class OrganisationalUnit {
public Guid Id { get; set; }
public String Name { get; set; }
public Int32 MemberCount { get; set; }
}
public class OrganisationalUnitWithParticipantGroups : OrganisationalUnit {
public IEnumerable<ParticipantGroup> ParticipantGroups { get; set; }
}
public class ParticipantGroup {
public Guid Id { get; set; }
public String Name { get; set; }
public Int32 MemberCount { get; set; }
}
这将仅返回OrganisationalUnit
类的属性,而不返回OrganisationalUnitWithParticipantGroups
的其他属性。
这有效:
public class SurveyReportResult {
public Guid Id { get; set; }
public String Name { get; set; }
public Int32 MemberCount { get; set; }
public IEnumerable<OrganisationalUnitWithParticipantGroups> OrganisationalUnits { get; set; }
}
public class OrganisationalUnitWithParticipantGroups /*: OrganisationalUnit*/ {
public Guid Id { get; set; }
public String Name { get; set; }
public Int32 MemberCount { get; set; }
public IEnumerable<ParticipantGroup> ParticipantGroups { get; set; }
}
public class ParticipantGroup {
public Guid Id { get; set; }
public String Name { get; set; }
public Int32 MemberCount { get; set; }
}
答案 1 :(得分:-1)
现在,我已经回到使用带有Microsoft.AspNetCore.Mvc.NewtonsoftJson
软件包的Newtonsoft.Json了。然后,如果有时间,我将尝试找出没有Newtonsoft.Json的解决方案。