【问题标题】:Deserialize a JSON object with varying types in child objects反序列化子对象中具有不同类型的 JSON 对象
【发布时间】:2016-03-22 22:00:09
【问题描述】:

当对象的子对象类型不同时,如何反序列化对象? 我从 Telegram Bot API 获得以下 JSON:

{  
   "ok":true,
   "result":[  
   {  
     "update_id":126107325,
     "message":{  
        "message_id":200,
        "from":{  
           "id":someid,
           "first_name":"somename"
        },
        "chat":{  
           "id":someid,
           "title":"asdasdasdasd"
        },
        "date":1438327336,
        "text":"\/lfdngdf"
     }
  }
 ]
}

其中“chat”表示“GroupChat”类型的对象。

当再次调用相同的方法时,可能会导致:

{  
   "ok":true,
   "result":[  
  {  
     "update_id":126107326,
     "message":{  
        "message_id":204,
        "from":{  
           "id":1234567,
           "first_name":"somename"
        },
        "chat":{  
           "id":1234567,
           "first_name":"Paul"
        },
        "date":1438327788,
        "text":"\/blaaa"
     }
  }
]
}

其中聊天代表一个对象哦类型“用户”。 我浏览了一些答案,但它们没有帮助,因为我不是直接反序列化“消息”而是“UpdatePacket”。

提前致谢!

【问题讨论】:

  • 您可以匹配一个 JSON 模式来验证返回了哪种类型的消息,然后进行相应的反序列化。

标签: c# json telegram-bot


【解决方案1】:
    public class TelegramBoApiMainObject
    {
        public Boolean ok { get; set; }
        public List<TelegramBotApiResult> result { get; set; }
    }

    public class TelegramBotApiResult
    {
        public Int32 update_id { get; set; }
        public TelegramBotApiMessage message { get; set; }
    }

    public class TelegramBotApiMessage
    {
        public Int32 message_id { get; set; }
        public TelegramBotApiFrom from { get; set; }
        public TelegramBotApiChat chat { get; set; }
        public Int32 date { get; set; }
        public String text { get; set; }
    }

    public class TelegramBotApiFrom
    {
        public Int32 id { get; set; }
        public String first_name { get; set; }
    }

    public class TelegramBotApiChat
    {
        public Int32 id { get; set; }
        public String first_name { get; set; }
        public String title { get; set; }
    }

然后你可以做一些事情,比如拥有 GroupChat 或 User

var json = "...."; // one of your json string
var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<TelegramBoApiMainObject>(json);
    var chat = obj.result[0].message.chat;
    if (String.IsNullOrEmpty(chat.title))
    {
        // user
    }
    else 
    {
        // group chat
    }

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多