多次调用Api C#
我试图使用rawgapi并从它们的api中获取游戏,我创建了游戏实体类来解析数据多次调用Api C#,c#,asp.net-core,asp.net-web-api,.net-core,C#,Asp.net Core,Asp.net Web Api,.net Core,我试图使用rawgapi并从它们的api中获取游戏,我创建了游戏实体类来解析数据 //game entity public class Game { public int Id { get; set; } public string Slug { get; set; } public string Name { get; set; } public string Released { get; set; }
//game entity
public class Game
{
public int Id { get; set; }
public string Slug { get; set; }
public string Name { get; set; }
public string Released { get; set; }
public string Background_Image { get; set; }
public int Rating { get; set; }
public int Playtime { get; set; }
}
现在我需要从api中获取游戏,我创建了这个方法
public static async Task<List<Game>> ApiRawgGamesRequest()
{
var gamesList = new List<Game>();
for (int i = 1; i < 250; i++)
{
using (var msg = new HttpRequestMessage(HttpMethod.Get, new Uri($"https://api.rawg.io/api/games?page_size=40&page={i}")))
using (var response = await _client.SendAsync(msg))
{
response.EnsureSuccessStatusCode();
var gamesResponse = await response.Content.ReadAsAsync<Game[]>();
gamesList.AddRange(gamesResponse);
}
}
return gamesList;
}
有更好的方法吗?您的异常是由错误的JSON解析对象造成的。
在您要调用的代码中:
var gamesResponse = await response.Content.ReadAsAsync<Game[]>();
您的异常是由错误的JSON解析对象造成的。
在您要调用的代码中:
var gamesResponse = await response.Content.ReadAsAsync<Game[]>();
因此,如果您试图仅反序列化json的“结果”部分,则必须使用响应json中的所有项构建一个类
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class Result {
public int id { get; set; }
public string slug { get; set; }
public string name { get; set; }
public string released { get; set; }
public bool tba { get; set; }
public string background_image { get; set; }
public double rating { get; set; }
}
public class Root {
public int count { get; set; }
public string next { get; set; }
public object previous { get; set; }
public List<Result> results { get; set; }
}
//根myDeserializedClass=JsonConvert.DeserializeObject(myJsonResponse);
公开课成绩{
公共int id{get;set;}
公共字符串slug{get;set;}
公共字符串名称{get;set;}
释放的公共字符串{get;set;}
公共bool tba{get;set;}
公共字符串背景_图像{get;set;}
公共双重评级{get;set;}
}
公共类根{
公共整数计数{get;set;}
公共字符串next{get;set;}
前一个公共对象{get;set;}
公共列表结果{get;set;}
}
您总是可以在线使用某种类型的Json>类生成器,用于此anwser:因此,如果您试图仅反序列化Json的“结果”部分,则必须使用响应Json中的所有项构建一个类
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class Result {
public int id { get; set; }
public string slug { get; set; }
public string name { get; set; }
public string released { get; set; }
public bool tba { get; set; }
public string background_image { get; set; }
public double rating { get; set; }
}
public class Root {
public int count { get; set; }
public string next { get; set; }
public object previous { get; set; }
public List<Result> results { get; set; }
}
//根myDeserializedClass=JsonConvert.DeserializeObject(myJsonResponse);
公开课成绩{
公共int id{get;set;}
公共字符串slug{get;set;}
公共字符串名称{get;set;}
释放的公共字符串{get;set;}
公共bool tba{get;set;}
公共字符串背景_图像{get;set;}
公共双重评级{get;set;}
}
公共类根{
公共整数计数{get;set;}
公共字符串next{get;set;}
前一个公共对象{get;set;}
公共列表结果{get;set;}
}
您总是可以在线使用某种类型的Json>类生成器,用于此anwser:有几个很好的答案可以解决结构不正确的问题。为了更好地控制变量名,我在这里添加了注释,这是一个很好的实践。注意,DataContract和DataMember是框架的一部分,但可以很好地与Json.Net配合使用,即使Json.Net附带了它们自己的注释集
[DataContract]
public class Payload
{
[DataMember(Name = "count")]
public int Count { get; set; }
[DataMember(Name = "next")]
public string Next { get; set; }
[DataMember(Name = "previous")]
public string Previous { get; set; }
[DataMember(Name = "results")]
public List<GameData> Results { get; set; }
}
[DataContract]
public class GameData
{
[DataMember(Name = "id")]
public long Id { get; set; }
[DataMember(Name = "slug")]
public string Slug { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "rating")]
public float Rating { get; set; }
[DataMember(Name = "rating_top")]
public float Rating_top { get; set; }
}
public static async Task<IEnumerable<Payload>> GetGameDatasAsync(int page = 1, int pageSize = 40, bool followNext = false, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
string next = $"https://api.rawg.io/api/games?page_size={pageSize}&page={page}";
var results = new List<Payload>();
using (var client = new HttpClient())
do
{
var result = await client.GetAsync(next, cancellationToken);
next = string.Empty;
if (result.IsSuccessStatusCode)
{
var json = await result.Content.ReadAsStringAsync();
if (!string.IsNullOrWhiteSpace(json))
{
var payload = JsonConvert.DeserializeObject<Payload>(json);
next = payload.Next;
results.Add(payload);
}
}
} while (!string.IsNullOrWhiteSpace(next) && followNext);
return results;
}
[DataContract]
公共类有效载荷
{
[DataMember(Name=“count”)]
公共整数计数{get;set;}
[DataMember(Name=“next”)]
公共字符串Next{get;set;}
[DataMember(Name=“previous”)]
前一个公共字符串{get;set;}
[DataMember(Name=“results”)]
公共列表结果{get;set;}
}
[数据合同]
公共类游戏数据
{
[数据成员(Name=“id”)]
公共长Id{get;set;}
[DataMember(Name=“slug”)]
公共字符串Slug{get;set;}
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[数据成员(Name=“评级”)]
公共浮动评级{get;set;}
[DataMember(Name=“rating_top”)]
公共浮动评级_top{get;set;}
}
公共静态异步任务GetGameDatasAsync(int page=1,int pageSize=40,bool followNext=false,CancellationToken CancellationToken=default)
{
cancellationToken.ThrowIfCancellationRequested();
字符串next=$”https://api.rawg.io/api/games?page_size={pageSize}&page={page}”;
var results=新列表();
使用(var client=new HttpClient())
做
{
var result=await client.GetAsync(下一步,cancellationToken);
next=string.Empty;
if(结果。IsSuccessStatusCode)
{
var json=await result.Content.ReadAsStringAsync();
如果(!string.IsNullOrWhiteSpace(json))
{
var payload=JsonConvert.DeserializeObject(json);
下一个=有效载荷。下一个;
结果。添加(有效载荷);
}
}
}while(!string.IsNullOrWhiteSpace(next)&&followNext);
返回结果;
}
对于结构不正确的问题,有几个很好的答案。为了更好地控制变量名,我在这里添加了注释,这是一个很好的实践。注意,DataContract和DataMember是框架的一部分,但可以很好地与Json.Net配合使用,即使Json.Net附带了它们自己的注释集
[DataContract]
public class Payload
{
[DataMember(Name = "count")]
public int Count { get; set; }
[DataMember(Name = "next")]
public string Next { get; set; }
[DataMember(Name = "previous")]
public string Previous { get; set; }
[DataMember(Name = "results")]
public List<GameData> Results { get; set; }
}
[DataContract]
public class GameData
{
[DataMember(Name = "id")]
public long Id { get; set; }
[DataMember(Name = "slug")]
public string Slug { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "rating")]
public float Rating { get; set; }
[DataMember(Name = "rating_top")]
public float Rating_top { get; set; }
}
public static async Task<IEnumerable<Payload>> GetGameDatasAsync(int page = 1, int pageSize = 40, bool followNext = false, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
string next = $"https://api.rawg.io/api/games?page_size={pageSize}&page={page}";
var results = new List<Payload>();
using (var client = new HttpClient())
do
{
var result = await client.GetAsync(next, cancellationToken);
next = string.Empty;
if (result.IsSuccessStatusCode)
{
var json = await result.Content.ReadAsStringAsync();
if (!string.IsNullOrWhiteSpace(json))
{
var payload = JsonConvert.DeserializeObject<Payload>(json);
next = payload.Next;
results.Add(payload);
}
}
} while (!string.IsNullOrWhiteSpace(next) && followNext);
return results;
}
[DataContract]
公共类有效载荷
{
[DataMember(Name=“count”)]
公共整数计数{get;set;}
[DataMember(Name=“next”)]
公共字符串Next{get;set;}
[DataMember(Name=“previous”)]
前一个公共字符串{get;set;}
[DataMember(Name=“results”)]
公共列表结果{get;set;}
}
[数据合同]
公共类游戏数据
{
[数据成员(Name=“id”)]
公共长Id{get;set;}
[DataMember(Name=“slug”)]
公共字符串Slug{get;set;}
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[数据成员(Name=“评级”)]
公共浮动评级{get;set;}
[DataMember(Name=“rating_top”)]
公共浮动评级_top{get;set;}
}
公共静态异步任务GetGameDatasAsync(int page=1,int pageSize=40,bool followNext=false,CancellationToken CancellationToken=default)
{
cancellationToken.ThrowIfCancellationRequested();
字符串next=$”https://api.rawg.io/api/games?page_size={pageSize}&page={page}”;
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class Result {
public int id { get; set; }
public string slug { get; set; }
public string name { get; set; }
public string released { get; set; }
public bool tba { get; set; }
public string background_image { get; set; }
public double rating { get; set; }
}
public class Root {
public int count { get; set; }
public string next { get; set; }
public object previous { get; set; }
public List<Result> results { get; set; }
}
[DataContract]
public class Payload
{
[DataMember(Name = "count")]
public int Count { get; set; }
[DataMember(Name = "next")]
public string Next { get; set; }
[DataMember(Name = "previous")]
public string Previous { get; set; }
[DataMember(Name = "results")]
public List<GameData> Results { get; set; }
}
[DataContract]
public class GameData
{
[DataMember(Name = "id")]
public long Id { get; set; }
[DataMember(Name = "slug")]
public string Slug { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "rating")]
public float Rating { get; set; }
[DataMember(Name = "rating_top")]
public float Rating_top { get; set; }
}
public static async Task<IEnumerable<Payload>> GetGameDatasAsync(int page = 1, int pageSize = 40, bool followNext = false, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
string next = $"https://api.rawg.io/api/games?page_size={pageSize}&page={page}";
var results = new List<Payload>();
using (var client = new HttpClient())
do
{
var result = await client.GetAsync(next, cancellationToken);
next = string.Empty;
if (result.IsSuccessStatusCode)
{
var json = await result.Content.ReadAsStringAsync();
if (!string.IsNullOrWhiteSpace(json))
{
var payload = JsonConvert.DeserializeObject<Payload>(json);
next = payload.Next;
results.Add(payload);
}
}
} while (!string.IsNullOrWhiteSpace(next) && followNext);
return results;
}