我正在尝试访问一个简单的REST API,https://api.cryptonator.com/api/ticker/btc-usd
相同的结果是这样的格式:
{"ticker":{"base":"BTC","target":"USD","price":"9969.76308171","volume":"127575.47420967","change":"-197.36472278"},"timestamp":1517410741,"success":true,"error":""}
现在,当我尝试从中获取结果时,我发现 json null、时间戳和错误对象的股票代码被填充。
因此,我怀疑可能存在数据成员与json文本不匹配的问题。我的模型看起来像这样:
public class CurtoUsd
{
public ticker tick { get; set; }
public Single timestamp { get; set; }
public bool success { get; set; }
public string error { get; set; }
}
public class ticker
{
public string _base { get; set; }
public string target { get; set; }
public string price { get; set; }
public string volume { get; set; }
public string change { get; set; }
}
请看一下,我应该使用 base 作为变量,但它是关键字,所以我使用了_base。
我正在使用httpclient asp.net 核心2.0 webapi,代码如下所示:
HttpClient client = new HttpClient();
if (client.BaseAddress == null)
{
client.BaseAddress = new Uri("https://api.cryptonator.com/");
}
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync(baseUrl);
CurtoUsd usdrate = new CurtoUsd();
if (response.IsSuccessStatusCode)
{
usdrate = await response.Content.ReadAsJsonAsync<CurtoUsd>();
}
return CommonFunctions.ConvertDouble(usdrate.tick.price);
细节
of function:
public static class HttpContentExtensions
{
public static async Task<T> ReadAsJsonAsync<T>(this HttpContent content)
{
string json = await content.ReadAsStringAsync();
T value = JsonConvert.DeserializeObject<T>(json);
return value;
}
}
我可以知道我做错了什么吗?我指出的观点是否正确,如果是这样,是否有任何解决方案。
请帮忙。
您可以在 C# 中使用 @ 来使用关键字作为标识符,例如 foo.@base.@class
.
因此,您的 DTO 变为:
public class Ticker
{
public string @base { get; set; } // Escape the `base` keyword with `@`
public string target { get; set; }
public string price { get; set; }
public string volume { get; set; }
public string change { get; set; }
}
请注意,您应该对类型标识符 n C#/.NET 使用 PascalCase
(因此class Ticker
而不是 class ticker
(,也应该对公共成员使用。
请注意,Newtonsoft.Json 实际上默认情况下对成员名称不区分大小写(除非您专门配置它(,因此您可以将 PascalCase 用于属性,这也阻止了它们成为 C# 关键字,并且它仍然可以工作:
public class Ticker
{
public string Base { get; set; } // `Base` is not a keyword
public string Target { get; set; }
public string Price { get; set; }
public string Volume { get; set; }
public string Change { get; set; }
}