【问题标题】:CoinPayment GetExchangeRates Api Response Hnadling IssueCoinPayment GetExchangeRates Api 响应问题
【发布时间】:2023-04-04 08:30:01
【问题描述】:

我正在研究 Coinpayment.net api 实施。我正在尝试使用 GetExchangeRate 方法获取 CoinExhange 汇率,但我无法解析响应。我想获取所有硬币汇率的列表,但我不知道我可以使用哪个响应类以及如何获取响应列表。 以下是我尝试的实现。

string result = string.Empty;
                using (HttpClient client = new HttpClient())
                {
                    client.BaseAddress = new Uri(_ApiReferenceLink);
                    var response = await client.GetAsync("GetExchangeRates");
                    if (response.IsSuccessStatusCode)
                    {
                        result = response.Content.ReadAsStringAsync().Result;
                        ExchangeRatesResponse datalist = JsonConvert.DeserializeObject<ExchangeRatesResponse>(result);
                        return Json(new { Message = "Your Transaction Has Been Completed Successfully!" }, JsonRequestBehavior.AllowGet);
                    }
                    else
                    {
                        return Json(new { ErrorMessage = "Your Transaction Has Not Been Completed. Try Again Later!" }, JsonRequestBehavior.AllowGet);
                    }
                }

上面的代码dint给了我对象的响应,以便我可以循环并获得所需的硬币价格。

这是 api 将返回给我的响应,我想将其转换为对象,以便我可以使用对象访问它。

{
  "error": "ok",
  "result": {
    "BTC": {
      "is_fiat": 0,
      "rate_btc": "1.000000000000000000000000",
      "last_update": "1375473661",
      "tx_fee": "0.00100000",
      "status": "online",
      "name": "Bitcoin",
      "confirms": "2",
      "capabilities": [
        "payments",
        "wallet",
        "transfers",
        "convert"
      ]
    },
    "LTC": {
      "is_fiat": 0,
      "rate_btc": "0.018343387500000000000000",
      "last_update": "1518463609",
      "tx_fee": "0.00100000",
      "status": "online",
      "name": "Litecoin",
      "confirms": "3",
      "capabilities": [
        "payments",
        "wallet",
        "transfers",
        "convert"
      ]
    },
    "USD": {
      "is_fiat": 1,
      "rate_btc": "0.000114884285404190000000",
      "last_update": "1518463609",
      "tx_fee": "0.00000000",
      "status": "online",
      "name": "United States Dollar",
      "confirms": "1",
      "capabilities": []
    },
    "CAD": {
      "is_fiat": 1,
      "rate_btc": "0.000091601308947890000000",
      "last_update": "1518463609",
      "tx_fee": "0.00000000",
      "status": "online",
      "name": "Canadian Dollar",
      "confirms": "1",
      "capabilities": []
    },
    "MAID": {
      "is_fiat": 0,
      "rate_btc": "0.000049810000000000000000",
      "last_update": "1518463609",
      "tx_fee": "0.00000000",
      "status": "online",
      "name": "MaidSafeCoin",
      "confirms": "2",
      "capabilities": [
        "payments",
        "wallet"
      ]
    },
    "XMR": {
      "is_fiat": 0,
      "rate_btc": "0.028198593333333000000000",
      "last_update": "1518463609",
      "tx_fee": "0.01000000",
      "status": "online",
      "name": "Monero",
      "confirms": "3",
      "capabilities": [
        "payments",
        "wallet",
        "transfers",
        "dest_tag"
      ]
    },
   "LTCT": {
      "is_fiat": 0,
      "rate_btc": "1.000000000000000000000000",
      "last_update": "1375473661",
      "tx_fee": "0.00100000",
      "status": "online",
      "name": "Litecoin Testnet",
      "confirms": "0",
      "capabilities": [
        "payments",
        "wallet",
        "transfers"
      ]
    }
  }
}

我使用的响应对象类是:

   public class ExchangeRatesResponse
    {

        public List<ExchangeRateItem> ItemsList { get; set; }
    }
    public class ExchangeRateItem
    {
        public string is_fiat { get; set; }
        public decimal rate_btc { get; set; }
        public int last_update { get; set; }
        public string name { get; set; }
        public int Confirms { get; set; }
    }

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • “无法”是什么意思?你的代码出了什么问题? ExchangeRatesResponse 是什么?它是您自己的自定义对象吗?
  • 是的,我尝试添加自己的自定义类,但效果不错。
  • @ADyson 我只想获得完整的响应列表,但我无法将 json 响应转换为对象格式
  • 请找人校对您的问题 (for reasons outlined here)。
  • 我不是在谈论技术方面的问题,我是在谈论几乎每个第二个单词出现的数量惊人的拼写错误、标点错误和大写错误。

标签: c# json asp.net-mvc json.net


【解决方案1】:

您的 C# 对象的结构与 JSON 不匹配。什么都不会反序列化为 List&lt;&gt;,因为 JSON 仅包含对象,而不包含数组(“功能”除外,但您似乎对此不感兴趣)。 result 是一个包含多个属性的对象,例如 BTC、LTC、USD 等。所以你需要做一些与之匹配的东西。

在我的脑海中(未经测试),这应该更像它:

public class ExchangeRatesResponse
  public ExchangeRateResult result { get; set; }
  public string error { get; set; }
}

public class ExchangeRateResult
{
  public ExchangeRateItem BTC { get; set; }
  public ExchangeRateItem LTC { get; set; }
  public ExchangeRateItem USD { get; set; }
  public ExchangeRateItem CAD { get; set; }
  public ExchangeRateItem MAID { get; set; }
  public ExchangeRateItem XMR { get; set; }
  public ExchangeRateItem LTCT { get; set; }
}

public class ExchangeRateItem
{
    public string is_fiat { get; set; }
    public decimal rate_btc { get; set; }
    public int last_update { get; set; }
    public string name { get; set; }
    public int confirms { get; set; }
}

【讨论】:

  • 非常感谢您的帮助,非常感谢您回答我的尴尬问题。解决方案对我有用。谢谢
  • @TamourAli 没问题。在这种情况下,请记住将答案标记为“已接受”和/或投票 - 谢谢
【解决方案2】:

您可以使用 LINQ 解析它。将以下指令添加到您的课程中。

使用 System.Linq;

此方法将返回您请求的列表。

public List<ExchangeRateItem> ParseAndReturnExchangeRateItemList(string jsonString)
    {
        //parse JSON and grab it's children. 
        var JSONobj = JObject.Parse(jsonString).Children();

        //turn into dictionary of property name and value
        var dictionary = JSONobj
            .Select(s => (s as JProperty))
            .ToDictionary(u => u.Name, v => v.Value);

        var ExchangeRateToExchangeDetailsDictionary =
            //grab result, maybe in another line grab error to make sure none exist. 
            dictionary["result"]
            .Select(s => (s as JProperty))
            .ToDictionary(u => u.Name 
            ,v => JsonConvert.DeserializeObject<ExchangeRateItem>(v.Value.ToString()));

        //you iterate through your dictionary like this
        foreach (var kvp in ExchangeRateToExchangeDetailsDictionary)
        {
            //this is just string key of the exchangeRateCode
            var exchangeRate = kvp.Key;
            //this will return the ExchangeRateItem object. 
            var exchangeRateDetails = kvp.Value;
        }
        //you can also get the ExchangeRateItem object per exchangeRate like this
        var giveMeUSExchangeRate = ExchangeRateToExchangeDetailsDictionary["USD"];

        //if you need to just return a list of ExchangeRateItem objects you can do this
        List<ExchangeRateItem> listOfExchangeRateItem = ExchangeRateToExchangeDetailsDictionary.Values.ToList();
        return listOfExchangeRateItem;
    }

您可以调用它并将您的 JSON 结果提供给它。

if (response.IsSuccessStatusCode)
{
    result = response.Content.ReadAsStringAsync().Result;
    ExchangeRatesResponse datalist = ParseAndReturnExchangeRateItem(result);
    return Json(new { Message = "Your Transaction Has Been Completed Successfully!" }, JsonRequestBehavior.AllowGet);
}

【讨论】:

  • 是的,你可以,但是当 JSON.NET 用一行代码为你做这件事时,为什么还要麻烦呢?
  • @ADyson 我明白你在说什么,但这样他就不必为每种汇率创建一个属性。他可以使用字典访问它们。我想他在某个时候会想知道汇率名称。
  • 可能,尽管在反序列化后将它们添加到列表中并不难,无需进行半手动反序列化。可能也可以使用像 AutoMapper 这样的东西来将其变成更好的结构。当然,最终真正的问题是 JSON 格式有点傻:-)。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 2020-12-12
  • 2019-11-17
  • 1970-01-01
相关资源
最近更新 更多