【问题标题】:How to figure out how to create objects relative to an api point using c#如何弄清楚如何使用 c# 创建相对于 api 点的对象
【发布时间】:2022-01-21 17:34:12
【问题描述】:

我想从https://rapidapi.com/coinlore/api/coinlore-cryptocurrency/的API获取数据

结果如下:

{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&lt;List&lt;ExchangeBody&gt;&gt;(body); 时,我看到了 catch 异常..

所以我 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…} 

【问题讨论】:

  • 异常(在ex)说什么?
  • Ben,在公共网站上发布您的秘密(如 API 密钥)不是一个好主意。这里可以是很棒的社区,但有人可以利用这一点。因此,请编辑您的代码并删除该 API 密钥
  • 不是bodyExchange吗?所以你应该反序列化JsonConvert.DeserializeObject&lt;Exchange&gt;(body); 而不是List&lt;ExchangeBody&gt;
  • 首先,您可以在浏览器中或使用任意数量的免费工具查看数据的原始视图。其次,不要告诉我们您“看到了异常”而不告诉我们究竟是什么异常。第三,可以使用VS或者json2csharp.com之类的工具将json翻译成C#类。
  • 当我使用 JsonConvert.DeserializeObject(body);我在“body”中看到了数据,当跳到下一行时 exchange = exchangeBody; -> 调试器跳过这一行并转到异常。我用异常消息更新问题。

标签: c# api xamarin rapidapi


【解决方案1】:

请求返回的 json 是 object 而不是 list,您应该将 json 反序列化为 object 而不是 list

如下修改你的代码

var exchangeBody = JsonConvert.DeserializeObject<Exchange>(body);
exchange = exchangeBody;

【讨论】:

  • 当我尝试您的方法时,我收到:CS0029:无法将类型“SmartCryptoWorld.Models.ExchangeBody”隐式转换为“SmartCryptoWorld.Models.Exchange”
  • 抱歉,请查看我的更新。
【解决方案2】:

最简单的方法是复制 API 调用的结果(如果数组中有更多项会更好)并使用编辑 > 选择性粘贴 > 将 Json 粘贴为类,现在对您进行一些更改可以有你想要的课程。

注意:您需要在之后检查类属性,例如,如果一个属性可以是double,但在您的特定结果中它有一个int 值,则特殊粘贴可能会将此属性视为int 而不是(以及其他罕见的类似情况),这就是为什么我建议使用更多数组项以提高准确性。

还要注意,“选择性粘贴”仅出现在代码文件(.cs、.vb)中,而不出现在视图、配置文件等中。

【讨论】:

  • 我没有“编辑”菜单中的“选择性粘贴”选项..(Visual Studio 2019 Mac 与上次更新)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多