亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

避免繼承 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條經驗 獲得超8個贊

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


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 關注
  • 122 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號