首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免继承JsonConverter递归

避免继承JsonConverter递归
EN

Stack Overflow用户
提问于 2019-04-02 00:01:19
回答 1查看 120关注 0票数 2

所以我有一个API,我点击它是为了在数据库中获取动物的详细信息

这些动物都有ID,所以我的web请求看起来像是/animal/1234

API的响应如下所示:

代码语言:javascript
复制
{
  "name": "Tony",
  "type": "Tiger",
  "stripeCount": 14
}

或者另选地

代码语言:javascript
复制
{
  "name": "Kermit",
  "type": "Frog",
  "slimy": true
}

当我查询API时,我不知道我会得到什么动物的type,但在某些情况下,我想把它们反序列化为适合它们的type的类。

下面是我目前正在使用的类,以及我正在尝试使用的JsonConverter属性:

代码语言:javascript
复制
[JsonConverter(typeof(AnimalJsonConverter))]
class Animal {
  public string name { get; set; }
  public string type { get; set; }
}

class Tiger : Animal {
  public int stripeCount { get; set; }
}

我已经设置了一个实现方法ReadJsonJsonConverter<Animal>,如下所示:

代码语言:javascript
复制
public override Animal ReadJson(JsonReader reader, Type objectType, Post existingValue, bool hasExistingValue, JsonSerializer serializer) {
  var animalObj = JObject.Load(reader);
  var type = (string)animalObj["type"];

  switch(type) {
    case "Tiger":
      return animalObj.ToObject<Tiger>();
    default:
      return animalObj.ToObject<Animal>();
  }
}

然而,这导致了一个问题,因为语句animalObj.ToObject<Tiger>();尊重Animal上的JsonConverter,并试图再次调用我的ReadJson方法,从而导致递归地狱

如果任何人能看到这个问题的解决方案,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-02 00:45:06

您可以使用不同的策略-填充类型的实例:

代码语言:javascript
复制
class AnimalJsonConverter : JsonConverter<Animal>
{
    public override void WriteJson(JsonWriter writer, Animal value, 
                                  JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override Animal ReadJson(JsonReader reader, Type objectType, 
              Animal existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var animalObj = JObject.Load(reader);
        var type = (string)animalObj["type"];

        Animal instance;

        switch (type)
        {
            case "Tiger":
                instance = new Tiger();
                break;

            case "Frog":
                instance = new Frog();
                break;

            default:
                instance = new Animal();
                break;
        }

        serializer.Populate(animalObj.CreateReader(), instance);
        return instance;
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55459238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档