新的ASP.NET Core 3.0 Json序列化器遗漏了数据

时间:2019-10-09 14:01:38

标签: asp.net-core jsonserializer asp.net-core-3.0

我正在将Web应用程序移植到ASP.NET Core 3,经过一番战斗之后,我几乎快要完成了。一切似乎都正常,但是从api返回的我的JSON数据突然缺少某些级别。

似乎options.JsonSerializerOptions.MaxDepth的默认级别为64,所以可以是这样。在其他地方可以选择欺骗我的东西吗?

这是代码(和值的快速浏览):

enter image description here

enter image description here

这是我在浏览器中获得的JSON:

enter image description here

因此在生成的输出中完全缺少ParticipantGroups属性/集合。

有什么想法吗?

编辑:

我已经在Github上添加了一个回购来展示这个问题。从模板创建的标准ASP.NET Core 3.0解决方案,对Weatherforecast控制器返回的结果进行了更改:

https://github.com/steentottrup/systemtextjsonissue

2 个答案:

答案 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的解决方案。