使用JSON格式时如何处理继承的类?

我需要我的 web-api 返回Rule以 json 格式序列化的实例列表。


[HttpGet]

[SwaggerOperation(nameof(GetRules))]

[SwaggerResponse(StatusCodes.Status200OK, typeof(List<Rule>), "Rules")]

[ProducesResponseType(StatusCodes.Status200OK)]

public async Task<IActionResult> GetRules()

{

    List<Rule> rules = /* retrieve rule from some storage */;


    return Ok(rules);

}

目前,有 2 种规则,每种规则在 Rule 类中共享的规则之上都有特定的属性;一个规则被称为RuleWithExpiration和其他RuleWithGracePeriod。


[JsonObject(MemberSerialization.OptIn)]

public class Rule

{

    [JsonProperty("id")]

    public Guid Id { get; }


    [JsonProperty("name")]

    public string Name { get; }


    [JsonConstructor]

    public Rule(Guid id, string name)

    {

        Id = id;

        Name = name;

    }

}


[JsonObject(MemberSerialization.OptIn)]


我遇到的问题是当我尝试反序列化它时,这个类层次结构有问题。反序列化后,我最终得到一个Rule实例列表,因为我不要求序列化程序包含类型信息,因为它被认为是一个安全问题。

这是序列化的字符串:


[{"someInfo":"Wat?","expiration":"2018-07-26T13:32:06.2287669Z","id":"29fa0603-c103-4a95-b627-0097619a7645","name":"Rule with expiration"},{"gracePeriod":"01:00:00","id":"bd8777bb-c6b3-4172-916a-546775062eb1","name":"Rule with grace period"}]

Rule这是反序列化后我得到的实例列表(如 LINQPad 所示):

http://img4.mukewang.com/617e7f2e0001655905570103.jpg


是否可以在此上下文中保留此继承树,或者我是否必须以某种方式重新排列这些类?如果是这样,这样做的方法是什么?


解决方案


我还没有找到感觉很好的解决方案。


例如,我可以有 RuleAggregate一个这样的类,但是每次我引入一种新规则时,我都必须编辑这个类并处理影响:


[JsonObject(MemberSerialization.OptIn)]

public class RuleAggregate

{

    [JsonProperty("expirations")]

    public List<RuleWithExpiration> Expirations {get;}


    [JsonProperty("gracePeriods")]

    public List<RuleWithGracePeriod> GracePeriods {get;}


    [JsonConstructor]

    public RuleAggregate(List<RuleWithExpiration> expirations, List<RuleWithGracePeriod> gracePeriods)

    {

        Expirations = expirations;

        GracePeriods = gracePeriods;

    }

}

我找到的权衡较少的解决方案 - 如果我想保留继承树 - 是依靠好的 ol' XML 序列化。


慕标5832272
浏览 215回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP