REST Web API:基于查询路径的JSON到C#对象

问题描述 投票:0回答:1

我有一个查询REST Web API的C#应用​​程序。

查询返回JSON对象。我试图将这些对象编组(解组)到C#。我使用System.Text.Json库执行(取消)编组。不同的查询路径返回不同类型的对象,并且我有一个Dictionary,用于根据所使用的查询路径来确定我们应该期望的数据类型。

public static class ModelTypes
{
    private static Dictionary<string, Type> all = new Dictionary<string, Type>()
    {
        { "achievements", typeof(List<Achievement>) }
    };
    public static Type GetTypeFromPath(string path)
    {
        if (all.ContainsKey(path)) return all[path];
        else return null;
    }
}

然后,我还有另一个包含HttpClient对象名称客户端的类。我编写了一个函数,该函数对API执行标准的GET请求,并返回调用该函数时指定的T类型的C#对象。

public async Task<T> Get<T>(string path)
{
    Task<Stream> streamTask = client.GetStreamAsync(path);
    return await JsonSerializer.DeserializeAsync<T>(await streamTask);
}

然后在应用程序中,我想实际调用此函数,但是我似乎无法用GetTypeFromPath()函数返回的类型代替T。

string path = "achievements";
Type type = ModelTypes.GetTypeFromPath(path);
if (type != null)
{
    var result = await api.Get<type>(path); // <--- Red squiggly under "type"
}
else ...

例如,如果我使用某种类型的硬编码:

var result = await api.Get<List<Achievement>>(path);
foreach (Achievement achievement in result) 
{ 
    Console.WriteLine(achievement.Name);
}

一切正常,控制台将为列表中的每个成就打印出名称。

关于如何简单地使用通用Get(字符串路径)的任何建议?相对于硬编码,如何动态指定T是什么?也许有更好的方法可以完成...

c# json rest api marshalling
1个回答
0
投票

我后来意识到,您试图将字符串反序列化为您在Type中定义的类型。

    public async Task<T> Get<T>(string path)
    {
        Task<Stream> streamTask = client.GetStreamAsync(path);
        return (T)await JsonSerializer.DeserializeAsync(await streamTask, typeof(T));
    }

而不是将T定义为TValueDeserializeAsync,您必须将Type作为参数传递给该方法。另外,由于该方法返回一个对象,因此您还必须在return语句中将其强制转换为return Type。

© www.soinside.com 2019 - 2024. All rights reserved.