为了账号安全,请及时绑定邮箱和手机立即绑定

避免继承 JsonConverter 递归

避免继承 JsonConverter 递归

C#
白猪掌柜的 2022-11-21 21:16:14
所以我有一个我点击的 API,以便在数据库中获取有关动物的详细信息这些动物有 ID,所以我的网络请求看起来像这样/animal/1234API 的响应如下所示:{  "name": "Tony",  "type": "Tiger",  "stripeCount": 14}或者替代地{  "name": "Kermit",  "type": "Frog",  "slimy": true}当我查询 API 时,我不知道type我会返回什么动物,但在某些情况下,我想将它们反序列化为适合它们的类type这是我目前正在使用的类,包括JsonConverter我正在尝试使用的属性:[JsonConverter(typeof(AnimalJsonConverter))]class Animal {  public string name { get; set; }  public string type { get; set; }}class Tiger : Animal {  public int stripeCount { get; set; }}我已经设置了一个JsonConverter<Animal>实现方法的方法ReadJson,如下所示: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>();尊重JsonConverteronAnimal并尝试ReadJson再次调用我的方法,从而导致递归地狱如果有人能看到这个问题的解决方案,我将不胜感激
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

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


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;

    }

}


查看完整回答
反对 回复 2022-11-21
  • 1 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信