2015-12-13 4 views
0

У меня есть классы, которые выглядят так, на основе JSON, возвращаемой апите слабину в:десериализации обобщенно типизированные классов с Newtonsoft

public class Response<T> 
{ 
    public bool ok { get; set; } 
    public string error { get; set; } 
} 

public class PostMessage : Response<PostMessage> 
{ 
    public string ts { get; set; } 
    public string channel { get; set; } 
    public Message message { get; set; } 
} 

public class ChannelsHistory : Response<ChannelsHistory> 
{ 
    public string latest { get; set; } 
    public List<Message> messages { get; set; } 
    public bool has_more { get; set; } 
} 

И я хочу, чтобы написать один метод, который может узкое место вызова JsonConvert.DeserializeObject<T>. Я не слишком много знаю о деталях реализации за этим методом, но я думал, что это будет работать:

internal static Response<T> GetSlackResponse<T>(List<KeyValuePair<string, string>> parameters = null) 
    { 
     Uri slackUri = BuidSlackUri(typeof(T), parameters); 
     String jsonResponse = GetJson(slackUri); 
     Response<T> response = JsonConvert.DeserializeObject<Response<T>>(jsonResponse); 

     if (!response.ok) 
     { 
      Aesthetic.Catch("The Slack API failed to respond successfully. " + response.error); 
     } 

     return response; 
    } 

Ничто не удается, но не все свойства, мне нужно в настоящее время десериализации. Например, вызов GetSlackResponse() вернет ответ, который имеет значение ok, равное true, но у меня не будет доступа к свойству Message класса PostMessage. Я пробовал кастинг (как явно, так и с as), безрезультатно.

Я уверен, что мне не хватает чего-то простого здесь, может кто-нибудь указать на это?

+0

can pls совместно используют код сообщения класс –

+0

общественный класс Сообщение { public string type {get; задавать; } public string ts {get; задавать; } public string user {get; задавать; } открытый текст строки {get; задавать; } общественный bool? is_starred {get; задавать; } общественный bool? wibblr {get; задавать; } канал общедоступной строки {get; задавать; } [JsonConstructor] общественного сообщения() {} общественное Сообщение (RtmEvent rtmObj) { типа = rtmObj.type; ts = rtmObj.ts; user = rtmObj.user; text = rtmObj.text; channel = rtmObj.channel; } } – Matt

+0

Некоторые из этих свойств являются ключевыми словами. Попробуйте добавить атрибуты сериализации как не ключевые слова или изменить имена свойств. –

ответ

1

Имея мой класс Response, класс типично типизированного класса был красной селедкой; он не вводил ничего, но делал проблему более запутанной. Мне нужен был только , а не тип.

Изменение соответствующей строки в GetSlackResponse<T>() методе из

Response<T> response = JsonConvert.DeserializeObject<Response<T>>(jsonResponse); 

в

T response = JsonConvert.DeserializeObject<T>(jsonResponse); 

фиксированного все. Теперь моим различным типам ответов нужно только расширить базовый класс Response, и будет правильно десериализован JSON.NET. Нет необходимости, чтобы ответ был типично типизированным объектом.