您可以使
GetObject
方法成为泛型,而无需使用参数
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\"}]";
我可以按照以下方式编写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();
}
以上方法中的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; }
}
我可以通过传递Person
或Employee
来调用GetObject
方法,并将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}");
}
总的来说,我想要表达的意思是如果了解JSON的格式,将适当的类型传递给
JsonConvert.Deserialize<T>
应该不会有任何问题。
如果传入的JSON表示一个集合,并尝试将其反序列化为简单类,则会失败,反之亦然也不起作用。
因此,对于您的问题,如果您知道JSON将是一个集合,那么使用
JsonConvert.Deserialize<List<T>>
应该不会给您带来任何问题,只要
T
具有可以从JSON中设置值的属性。
我希望这能帮助您解决问题。
obj = JsonConvert.DeserializeObject<dynamic>(response.Content);
,然后像obj.MyCustomProperty
一样访问您的属性,怎么样? - DolceVitaJsonConvert.DeserializeObject<SomeObject>
,然后它就知道所有属性,所以它可以将其转换为类型SomeObject
。在我的情况下,我无法对List<T>
进行强类型化。 - christopher clark