如何弄清楚如何使用 c# 创建相对于 api 点的对象
How to figure out how to create objects relative to an api point using c#
我想从 API 从 https://rapidapi.com/coinlore/api/coinlore-cryptocurrency/
获取数据
结果如下:
{2 items
"data":[...]100 items
"info":{...}2 items
}
当我这样看时,我不确定如何创建对象。
我想获取数据数组并创建一个这样的对象:
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace SmartCryptoWorld.Models
{
public class Exchange
{
[JsonProperty("data")]
public List<ExchangeBody> CryptoExchange { get; set; }
}
public class ExchangeBody
{
[JsonProperty("symbol")]
public string Symbol { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("price_usd")]
public double Price { get; set; }
[JsonProperty("percent_change_24h")]
public double Percent_Change_24h { get; set; }
[JsonProperty("percent_change_1h")]
public double Percent_Change_1h { get; set; }
[JsonProperty("percent_change_7d")]
public double Percent_Change_7d { get; set; }
[JsonProperty("market_cap_usd")]
public double Market_Cap_USD { get; set; }
}
}
这是有效但数据未进入列表并去捕获异常的方法:
private async Task GetExchange()
{
try
{
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://coinlore-cryptocurrency.p.rapidapi.com/api/tickers/?start=0&limit=100"),
Headers =
{
{ "x-rapidapi-host", "coinlore-cryptocurrency.p.rapidapi.com" },
{ "x-rapidapi-key", "51569aba99mshf9e839fcfce791bp16c0dbjsn9ced6dba7472" },
},
};
using (var response = await client.SendAsync(request))
{
var exchange = new Exchange();
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
var exchangeBody = JsonConvert.DeserializeObject<List<ExchangeBody>>(body);
exchange.CryptoExchange = exchangeBody;
}
}
catch (Exception ex)
{
await DisplayAlert("Alert", "Please, check your internet connection.", "OK");
}
}
在 var body = await response.Content.ReadAsStringAsync();
中,我看到来自 API 的数据,当我使用调试器跨过下一行时 var exchangeBody = JsonConvert.DeserializeObject<List<ExchangeBody>>(body);
我看到捕获异常..
所以我 100% 确定对象不是它们应该的样子?
异常信息为:
ex {Java.Net.UnknownHostException: Unable to resolve host "coinlore-cryptocurrency.p.rapidapi.com": No address associated with hostname ---> Java.Lang.RuntimeException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname) --- End of inne…}
最简单的方法是复制 API 调用的结果(如果数组中有更多项则更好)并使用“编辑”>“选择性粘贴”>“粘贴”Json 作为 类,现在稍作改动就可以得到你想要的 class。
注意:之后您需要检查 class 属性,例如,如果 属性 可以是 double
但在您的特定结果中它具有 int
值,特殊粘贴可能会将此 属性 视为 int
而不是(以及其他罕见的类似情况),这就是为什么我建议使用更多数组项以获得更高的准确性。
另请注意,“选择性粘贴”仅出现在代码文件(.cs、.vb)中,而不出现在视图、配置文件等中
请求中的 json return 是 object
而不是 list
,您应该将 json 反序列化为 object
而不是list
.
修改你的代码如下
var exchangeBody = JsonConvert.DeserializeObject<Exchange>(body);
exchange = exchangeBody;
我想从 API 从 https://rapidapi.com/coinlore/api/coinlore-cryptocurrency/
获取数据结果如下:
{2 items
"data":[...]100 items
"info":{...}2 items
}
当我这样看时,我不确定如何创建对象。
我想获取数据数组并创建一个这样的对象:
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace SmartCryptoWorld.Models
{
public class Exchange
{
[JsonProperty("data")]
public List<ExchangeBody> CryptoExchange { get; set; }
}
public class ExchangeBody
{
[JsonProperty("symbol")]
public string Symbol { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("price_usd")]
public double Price { get; set; }
[JsonProperty("percent_change_24h")]
public double Percent_Change_24h { get; set; }
[JsonProperty("percent_change_1h")]
public double Percent_Change_1h { get; set; }
[JsonProperty("percent_change_7d")]
public double Percent_Change_7d { get; set; }
[JsonProperty("market_cap_usd")]
public double Market_Cap_USD { get; set; }
}
}
这是有效但数据未进入列表并去捕获异常的方法:
private async Task GetExchange()
{
try
{
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://coinlore-cryptocurrency.p.rapidapi.com/api/tickers/?start=0&limit=100"),
Headers =
{
{ "x-rapidapi-host", "coinlore-cryptocurrency.p.rapidapi.com" },
{ "x-rapidapi-key", "51569aba99mshf9e839fcfce791bp16c0dbjsn9ced6dba7472" },
},
};
using (var response = await client.SendAsync(request))
{
var exchange = new Exchange();
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
var exchangeBody = JsonConvert.DeserializeObject<List<ExchangeBody>>(body);
exchange.CryptoExchange = exchangeBody;
}
}
catch (Exception ex)
{
await DisplayAlert("Alert", "Please, check your internet connection.", "OK");
}
}
在 var body = await response.Content.ReadAsStringAsync();
中,我看到来自 API 的数据,当我使用调试器跨过下一行时 var exchangeBody = JsonConvert.DeserializeObject<List<ExchangeBody>>(body);
我看到捕获异常..
所以我 100% 确定对象不是它们应该的样子?
异常信息为:
ex {Java.Net.UnknownHostException: Unable to resolve host "coinlore-cryptocurrency.p.rapidapi.com": No address associated with hostname ---> Java.Lang.RuntimeException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname) --- End of inne…}
最简单的方法是复制 API 调用的结果(如果数组中有更多项则更好)并使用“编辑”>“选择性粘贴”>“粘贴”Json 作为 类,现在稍作改动就可以得到你想要的 class。
注意:之后您需要检查 class 属性,例如,如果 属性 可以是 double
但在您的特定结果中它具有 int
值,特殊粘贴可能会将此 属性 视为 int
而不是(以及其他罕见的类似情况),这就是为什么我建议使用更多数组项以获得更高的准确性。
另请注意,“选择性粘贴”仅出现在代码文件(.cs、.vb)中,而不出现在视图、配置文件等中
请求中的 json return 是 object
而不是 list
,您应该将 json 反序列化为 object
而不是list
.
修改你的代码如下
var exchangeBody = JsonConvert.DeserializeObject<Exchange>(body);
exchange = exchangeBody;