我正在尝试编写一种方法,将任何类型的分页 API 调用的所有结果收集到一个列表中。到目前为止我的方法看起来像这样...
private async Task<List<T>> AggregateResults<T>(string url)
{
var results = new List<T>();
var morePages = true;
while (morePages)
{
var response = await _httpClient.GetAsync(url);
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<PaginatedResult>(responseContent);
results.AddRange(result.results.Cast<T>().ToList());
if (result.paging != null)
{
url = result.paging.next.link;
}
else
{
morePages = false;
}
}
return results;
}
分页结果类看起来像这样
{
public class PaginatedResult
{
public object[] results { get; set; }
public Paging? paging { get; set; }
}
public class Paging
{
public Next next { get; set; }
}
public class Next
{
public string after { get; set; }
public string link { get; set; }
}
}
我将这样的东西作为该方法的泛型传递
public class Person
{
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
}
public class Car
{
public string Make { get; set; }
public string Model { get; set; }
}
我现在收到此错误
'Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type
。
有什么方法可以从这里的 object[] 获取列表吗?
我尝试过以任何我能找到的方式来转换数组,但总是遇到错误。我考虑过在我的类中继承
PaginatedResult
,我试图将其放入列表中,但无法理解它如何工作或是否会工作。
尝试将
PaginatedResult
设为泛型类 PaginatedResult<T>
,并将结果类型从 object[]
更改为 T[]
using Newtonsoft.Json;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
const string j = """
{
"results": [
{ "name": "a", "DateOfBirth": "2000/01/01" },
{ "name": "b", "DateOfBirth": "2000/01/01" },
],
"paging" : {
"next": {
"after": "...",
"link": "..."
}
}
}
""";
var res = JsonConvert.DeserializeObject<PaginatedResult<Person>>(j);
Console.WriteLine(res.results[0].Name);
}
public class PaginatedResult<T>
{
public T[] results { get; set; }
public Paging? paging { get; set; }
}
public class Paging
{
public Next next { get; set; }
}
public class Next
{
public string after { get; set; }
public string link { get; set; }
}
public class Person
{
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
}
}
}