如何调用具有 c# 关键字的 REST API 结果 json



我正在尝试访问一个简单的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; }
}

相关内容

最新更新