多态类型鉴别器在反序列化期间不会转换为枚举

Polymorphic type discriminator is not converted to enum during deserialization

提问人:Artur Safiullin 提问时间:3/7/2023 最后编辑:Artur Safiullin 更新时间:3/7/2023 访问量:307

问:

我正在使用枚举字段作为多态序列化/反序列化的类型鉴别器,并遇到了奇怪的行为。作为类型鉴别器的字符串值不会转换为枚举,并设置此枚举的默认值。

这是我的 C# 模型

[JsonPolymorphic(TypeDiscriminatorPropertyName = "type")]
[JsonDerivedType(typeof(FixedPenalty), typeDiscriminator: "fixedPenalty")]
[JsonDerivedType(typeof(FixedRatePenalty), typeDiscriminator: "fixedRatePenalty")]
[JsonDerivedType(typeof(RelativePenalty), typeDiscriminator: "relativePenalty")]
public abstract class Penalty
{
    public PenaltyType Type { get; set; }
    public string Description { get; set; }

    public Penalty(PenaltyType type,
        string description)
    {
        Type = type;
        Description = description;
    }
}

这是我发送到控制器的 json

{
   "type": "relativePenalty",
   "description": "string",
   "rate": 10.9,
   "unit": "year"
}

如您所见,反序列化工作正常,对象类型正确,但枚举未转换。

Debug

有什么方法可以解决这种行为吗?现在我看到了两种解决问题的方法,要么将纯粹用于鉴别器的技术字段添加到 DTO 模型中,这将复制“类型”字段,要么检查类型转换,然后从特定的应用层转换为所需的模型,但我不喜欢这两种方法。

system.text.json 多态反序列化的 C# 枚举

评论

1赞 shingo 3/7/2023
为什么需要房产?对于儿童班级来说,这似乎是肯定的。Type
0赞 Artur Safiullin 3/7/2023
@shingo我在系统的其他部分需要它。
0赞 Artur Safiullin 3/7/2023
哦,是的。明白了。Penalty 以前不是抽象的,有自己的 PenaltyType。

答: 暂无答案