【问题标题】:C# - deserialize jsonC# - 反序列化 json
【发布时间】:2018-07-02 21:56:42
【问题描述】:

我正在尝试编写一个交易机器人作为学习体验(别担心,我不会使用它)。我正在尝试反序列化传入的数据,但没有运气。这是我第一次在 C# 中使用 json,但我在其他语言中也这样做过,当然不是很擅长。

我创建了一个如下所示的类:

public class Coin
    {
        public string symbol { get; set; }
        public double price {get;set;}
    }

我正在像这样获取和读取数据:

using (WebClient w = new WebClient())
            {
                try
                {
                var json = w.DownloadString("https://api.binance.com/api/v3/ticker/price");
                int length = json.Length;
                string newJson = json.Substring(1, length-2);
//had to create new string because having [] made it crash
                Coin coin = JsonConvert.DeserializeObject<Coin>(newJson);
                Console.Write(coin); // this does not print anything
            }catch(JsonReaderException e){}
           }

传入数据如下所示(或直接点击链接):

{"symbol":"ETHBTC","price":"0.07190100"},{"symbol":"LTCBTC","price":"0.01298100"}

现在,我试图只得到其中一个,但我得到了所有。首先我猜我的 Coin 类有问题,其次我不知道如何访问其中一个。

谢谢

【问题讨论】:

  • 您使用的 API 调用应该返回所有代码/价格对。你到底想得到哪一个?您需要任何特定的符号吗?

标签: c# json deserialization


【解决方案1】:

您正在获取对象数组,但您正试图反序列化为单个对象。 [] 符号是有原因的。不要删除它们。而是序列化为Coin[],然后从该数组中获取.FirstOrDefault()

类似这样的:

using System.Linq;

var json = w.DownloadString("https://api.binance.com/api/v3/ticker/price");
var coins = JsonConvert.DeserializeObject<Coin[]>(json);
var firstCoin = coins.FirstOrDefault();
if (firstCoin != null)
{
     Console.Write($"Symbol: {firstCoin.symbol}; Price: {firstCoin.price}");
}

【讨论】:

【解决方案2】:

我认为您的 Coin 课程没有任何问题。 其次,我建议您将 JSON 反序列化为硬币列表。

List<Coin> coins = new List<Coin>();
coins = JsonConvert.DeserializeObject<List<Coin>>(newJson);

在您的代码中,您反序列化了多个 Coin 对象,并且您希望将它们存储在一个包含一个 Coin 对象的变量中。这就是为什么我建议制作一个对象列表,以便可以存储多个硬币对象。

然后您可以通过索引获取列表中的一项。

// This returns the first value
var oneItem = coins[0]

我希望这可以解决问题!

【讨论】:

  • 您尝试序列化为单个对象。你需要JsonConvert.DeserializeObject&lt;List&lt;Coin&gt;&gt;
  • 谢谢@DeveloperOfDreams。我让它与 trailmax 的版本一起工作
  • 您需要修复此代码 - 它现在不起作用。你也没有解释为什么 OP 有错误。如果这两件事你都做了,你就会有一个很好的答案。现在还缺。
  • 做到了,对不起,我不经常回答或在 StackOverflow 上发帖,所以我有点新。但我正在努力掌握它!感谢您指出如何改进我的答案
猜你喜欢
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
相关资源
最近更新 更多