无法在.net 5中使用JsonSubTypes在WebApi中反序列化Json,尽管在Console App中可以



我正试图在我的项目的web api实现多态反序列化。我有以下基类和派生类:

基类

[JsonConverter(typeof(JsonSubtypes), "PointType")]
public abstract class BasePointRule
{
public abstract string PointType { get; }
}

派生类

public class DayOfWeekPointRule : BasePointRule
{
public int Id { get; set; }
public decimal Mon { get; set; } = 0;
public decimal Tue { get; set; } = 0;
public decimal Wed { get; set; } = 0;
public decimal Thu { get; set; } = 0;
public decimal Fri { get; set; } = 0;
public decimal Sat { get; set; } = 0;
public decimal Sun { get; set; } = 0;
public int GroupId { get; set; }
public Group Group { get; set; }
public override string PointType { get;} = "DayOfWeekPointRule";

public DayOfWeekPointRule()
{
}
}

当将子类型的json发布到我的Web Api控制器时,我得到一个错误。下面是用双引号转义的json:

{
"PointType":"DayOfWeekPointRule",
"Mon":0,
"Tue":0,
"Wed":0,
"Thu":0,
"Fri":0,
"Sat":0,
"Sun":0
}

这是web api控制器方法:

[HttpPost("AddPointRule")]
public IActionResult AddPointRule(BasePointRule rule)
{
ConfigurationService.AddPointRule(rule);
return Ok();
}

我得到的错误信息是:

系统。无法创建类型为"RosterCharm.Models.Rules.BasePointRule"的实例。模型绑定的复杂类型不能是抽象类型或值类型,并且必须具有无参数构造函数。记录类型必须有一个主构造函数。或者,给'rule'参数一个非空的默认值。在Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexObjectModelBinder。CreateModel (ModelBindingContext bindingContext)在Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexObjectModelBinder。BindModelCoreAsync(ModelBindingContext bindingContext, Int32 propertyData)在Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder。BindModelAsync(ActionContext ActionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata元数据,Object value, Object container),在Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider。你们的在c__DisplayClass0_0灵活;g__Bind | 0祝辞d.MoveNext ()——前一个位置的堆栈跟踪结束——

如果我将控制器路由中的参数从基类更改为派生类,json将被正确反序列化。

如果我在控制台应用程序中实现上述内容并调用以下代码,那么json将被反序列化为派生类型,而不会出现问题:

var derivedType = JsonConvert.DeserializeObject<BasePointRule>(json);

这让我认为这个问题是特定于。net(我使用。net 5),并试图确保我使用Json。净(Newtonsoft。通过在startup.cs

中调用以下代码,而不是System.Text.Json。
services.AddControllers().AddNewtonsoftJson();

任何提示将不胜感激。我想尝试实现我自己的Json转换器,但希望能够利用Json子类型库轻松。

public IActionResult AddPointRule([FromBody] BasePointRule rule)
{

}

相关内容

  • 没有找到相关文章

最新更新