使用Newtonsoft反序列化泛型类型的类



我有这样的类,基于Slack的api:返回的json

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的响应,但我无法访问PostMessage类的Message属性。我尝试过类型转换(显式和使用as),但都没有成功。

我肯定我遗漏了一些简单的东西,有人能指出吗?

让我的各种响应类扩展一个泛型类是转移注意力;它只会使问题更加混乱。我只需要方法是泛型的,而不是类型本身。

从更改GetSlackResponse<T>()方法中的相关行

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

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

修复了所有问题。现在,我的各种响应类型只需要扩展我的基类response,将被JSON.NET正确地反序列化。响应不需要是泛型类型的对象。

相关内容

  • 没有找到相关文章

最新更新