使用Newtonsoft反序列化一般类型的类

时间:2015-12-13 00:26:25

标签: c# json json.net

我有类似这样的类,基于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的Response,但是我将无法访问PostMessage类的Message属性。我已经尝试过(无论是明确地还是使用as),都无济于事。

我确定我在这里遗漏了一些简单的东西,有人能说出来吗?

1 个答案:

答案 0 :(得分:1)

让我的各种Response类扩展一个通用类型的类是一个红色的鲱鱼;它没有引入任何东西,只是让问题更加混乱。我只需要方法是通用的,而不是类型本身。

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

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

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

修复了一切。现在我的各种响应类型只需要扩展我的基本Response类,将被JSON.NET正确反序列化。响应不需要是一般类型的对象。