Json反序列化未知或通用模型类型

时间:2018-07-23 18:16:49

标签: c# json json.net

这不可能。

这是工作代码:

HttpResponseMessage playerResponse = await client.GetAsync("2018/export?TYPE=players&DETAILS=1&SINCE=&PLAYERS=9988%2C13604&JSON=1");
if (playerResponse.IsSuccessStatusCode)
{
    var json = await playerResponse.Content.ReadAsStringAsync();
    var o = JsonConvert.DeserializeObject<MFLPlayerAPIResult>(json);
    playerList = o.PlayerData.MflPlayers.ToList();                    
}

问题是我有很多类似于MFLPlayerAPIResult的模型,就像上面的代码一样,它们都使用不同的请求字符串。我正在尝试构建这样的功能:

private async Task<Object> CreateListFromJson(Type jsonclass, string request, HttpClient client)
{
    HttpResponseMessage response = await client.GetAsync(request);
    if (response.IsSuccessStatusCode)
    {
        var json = await response.Content.ReadAsStringAsync();
        var o = JsonConvert.DeserializeObject<jsonclass>(json);
        return (o);
    }
    return (null);
}

其中返回的Object与参数中使用的Type jsonclass的模型相同,那么我可以使用如下函数:

playerList = CreateListFromJson(MFLPlayerAPIResult, request, client).PlayerData.MflPlayers.ToList();

并与不同的请求字符串和模型类型一起多次使用它。

这可能吗?

1 个答案:

答案 0 :(得分:3)

如果您提前知道类型,则可以像这样输入通用参数:

private async Task<T> CreateListFromJson<T>(string request, HttpClient client)
    where T: class
{
    var myObj = JsonConvert.DeserializeObject<T>(item);
    //...
}

如果直到编译时才知道类型,则可以在运行时通过传递类型来调用反序列化

private async Task<Object> CreateListFromJson(Type jsonclass, string request, HttpClient client)
{
    var myObj = JsonConvert.DeserializeObject(item, jsonclass);
    //...
}