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)
您可以使GetObject方法通用而无需使用parameter IEnumerable<T> obj。
根据解决方案,我建议您假设您知道从URL返回的JSON值的格式。
例如,URL返回包含项目数组的JSON,并且每个项目都有两个属性firstName和lastName。
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值的属性即可。
希望这可以帮助您解决问题。
| 归档时间: |
|
| 查看次数: |
6794 次 |
| 最近记录: |