代码之家  ›  专栏  ›  技术社区  ›  dave317

JSON反序列化未知或泛型模型类型

  •  2
  • dave317  · 技术社区  · 6 年前

    这可能是不可能的。

    以下是工作代码:

    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 回复  |  直到 6 年前
        1
  •  3
  •   johnny 5    6 年前

    如果您提前知道类型,您可以接受这样的通用参数:

    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);
        //...
    }