C # - десериализация JSON - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь написать торгового бота как учебный опыт (не волнуйтесь, я не буду его использовать). Я пытаюсь десериализовать входящие данные без удачи. Я впервые работаю с json в C #, но я делал это на других языках, хотя, конечно, не очень хорошо.

Я создал класс, который выглядит следующим образом:

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"}

Теперь я пытаюсь получить только один из них, но я получаю все. Во-первых, я предполагаю, что что-то не так с моим классом монет, а во-вторых, я не знаю, как получить доступ только к одному из них.

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я не вижу ничего плохого в вашем классе монет. Во-вторых, я советую вам сделать десериализацию JSON в Список монет.

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

В своем коде вы десериализовали несколько Coin-объектов и хотели сохранить их в переменной, содержащей один Coin-объект. Вот почему я посоветовал составить список объектов, чтобы можно было хранить несколько объектов Coin.

Затем вы можете получить один элемент списка по индексу.

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

Я надеюсь, что это сработало!

0 голосов
/ 03 июля 2018

Вы получаете массив объектов, но вы пытаетесь десериализовать в один объект. Есть причина для [] символов. Не удаляйте их. Вместо этого сериализуйте в 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}");
}
...