Десериализовать объект JSON с различными типами в дочерних объектах

Как я могу десериализовать объект, когда типы его дочерних объектов различаются? Я получаю следующий JSON от Telegram Bot API:

{  
   "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"
     }
  }
 ]
}

Где «чат» представляет собой объект типа «Групповой чат».

При повторном вызове того же метода это может привести к следующему:

{  
   "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».

Заранее спасибо!


person mammago    schedule 31.07.2015    source источник
comment
Вы можете сопоставить схему JSON, чтобы проверить, какой тип сообщения был возвращен, а затем соответствующим образом десериализовать.   -  person dcastro    schedule 31.07.2015


Ответы (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
    }
person yannick    schedule 31.07.2015