通用类型JsonConvert.DeserializeObject <List <T >>(string)

chr*_*ark 6 c# generics serialization json.net

我正在使用Newtonsoft.JSON。我不知道传递给此方法或检索到该方法DeserializeObject的对象的类型,因此我试图在不知道其类型的对象上使用。

这可能吗?如果是这样,怎么办?这是我的代码。

public static List<T> GetObject<T>(string cacheKey, IEnumerable<T> obj)
{
    using (HttpClient client = new HttpClient())
    {
        var response = client.GetAsync("http://localhost:53805/api/NonPersisted/Get/" + cacheKey).Result;

        obj = JsonConvert.DeserializeObject<obj.GetType>(response.Content.ToString());
        return obj.ToList();
    }            
}
Run Code Online (Sandbox Code Playgroud)

我首先尝试使用

obj = JsonConvert.DeserializeObject<List<T>>(response.Content.ToString());

显然,这是行不通的,它无法解析。它说,获取对象的类型不会建立obj is a variable but used like a type

编辑 看来您可以在List<T>不知道类型的情况下使用泛型JsonConvert.DeserializeObject<>。真正的错误是,response.Content该类仅返回该类型。你需要...

obj = JsonConvert.DeserializeObject<List<T>>(response.Content.ReadAsStringAsync().Result);
Run Code Online (Sandbox Code Playgroud)

Che*_*iya 6

您可以使GetObject方法通用而无需使用parameter IEnumerable<T> obj

根据解决方案,我建议您假设您知道从URL返回的JSON值的格式。

例如,URL返回包含项目数组的JSON,并且每个项目都有两个属性firstNamelastName

var response = "[{\"firstName\":\"Melanie\",\"lastName\":\"Acevedo\"},
    {\"firstName\":\"Rich\",\"lastName\":\"Garrett\"},
    {\"firstName\":\"Dominguez\",\"lastName\":\"Rose\"},
    {\"firstName\":\"Louisa\",\"lastName\":\"Howell\"},
    {\"firstName\":\"Stone\",\"lastName\":\"Bean\"},
    {\"firstName\":\"Karen\",\"lastName\":\"Buckley\"}]";
Run Code Online (Sandbox Code Playgroud)

我可以编写GetObject如下的方法。

public static List<T> GetObject<T>()
{
    var response = "
        [{\"firstName\":\"Melanie\",\"lastName\":\"Acevedo\"},
        {\"firstName\":\"Rich\",\"lastName\":\"Garrett\"},
        {\"firstName\":\"Dominguez\",\"lastName\":\"Rose\"},
        {\"firstName\":\"Louisa\",\"lastName\":\"Howell\"},
        {\"firstName\":\"Stone\",\"lastName\":\"Bean\"},
        {\"firstName\":\"Karen\",\"lastName\":\"Buckley\"}]";

    var obj = JsonConvert.DeserializeObject<List<T>>(response);
        return obj.ToList();
}
Run Code Online (Sandbox Code Playgroud)

在这里T,上述方法可以通过具有属性firstName和的任何类型lastName。例如

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public double Salary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我可以GetObject通过传递Person或来调用method,Employee并按如下所示将反序列化的JSON字符串获取到这些类的对象的集合。

var persons = GetObject<Person>();

foreach (var item in persons)
{
    Console.WriteLine($"{item.FirstName} {item.LastName}");
}

var employees = GetObject<Employee>();

foreach (var item in employees)
{
    Console.WriteLine($"{item.FirstName} {item.LastName}");
}
Run Code Online (Sandbox Code Playgroud)

总体而言,我要说明的是,是否知道JSON格式是否可以正确传递传递的Type JsonConvert.Deserialize<T>而不出现任何问题。

如果传入的JSON表示一个集合,并且尝试将其反序列化为一个简单的类将失败,反之亦然。

因此,对于您的问题,如果您知道JSON将是一个集合,则使用JsonConvert.Deserialize<List<T>>不会给您带来任何问题,只要 T具有可以设置JSON值的属性即可。

希望这可以帮助您解决问题。