Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2018, 02:20   #1
Nezhniy
Пользователь
 
Регистрация: 05.11.2013
Сообщений: 22
По умолчанию Ошибка десериализации

Добрый день! Код работал с API одной биржи, все считывало. Захотел взять данные с API другой биржи, но тут выскакивает ошибка при десериализации.

Код:
  public List<Instrument> Getinfo()
        {            
            string res = Query("GET", "/public/getticker?market=BTC-LTC");

            return JsonConvert.DeserializeObject<List<Instrument>>(res);            

        }
Код:
   public class Instrument
    {   
    public double Bid { get; set; }
    public double Ask { get; set; }
     public double Last { get; set; }}
Код выполняется без проблем на API этой биржи: https://testnet.bitmex.com/api/v1/qu...0&reverse=true


А пытаюсь взять данные с API этой биржи: https://bittrex.com/api/v1.1/public/...-LTC&type=both

Скриншот ошибки приложил. Возможно ли с второй биржи пользоваться JsonConvert.DeserializeObject и в чем проблема? Спасибо!
Изображения
Тип файла: jpg Снимок.JPG (84.4 Кб, 128 просмотров)
Nezhniy вне форума Ответить с цитированием
Старый 05.04.2018, 07:27   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

так чёрным по серому написано: в json лежит объект, а его пытаются преобразовать в список объектов.
и как вообще библиотека должна в этот Instrument что-то записать? Там возвращается вообще никак не пересекающийся json.
Для каждой биржи нужно писать отдельные классы (DTO) с соответствующими именами свойств и/или проставленными атрибутами JsonObject и т.п.
Потом уже эти DTO из разных бирж маппить на какие-то унифицированные объекты. Вручную или через какой-нибудь Automapper.
pu4koff вне форума Ответить с цитированием
Старый 05.04.2018, 10:01   #3
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Это классы для десериализации объектов
Код:
 public class Buy
        {
            public double Quantity { get; set; }
            public double Rate { get; set; }
        }

        public class Sell
        {
            public double Quantity { get; set; }
            public double Rate { get; set; }
        }

        public class Result
        {
            public List< Buy > buy { get; set; }
            public List< Sell > sell { get; set; }
        }

        public class QueryResult
        {
            public bool success { get; set; }

            public string message { get; set; }

            public Result result { get; set; }
        }
Это код десериализации
Код:
JsonConvert.DeserializeObject< QueryResult >( res );
Генерировал класс с помощью этого.
Хороший код генерируется здесь тырк
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 05.04.2018 в 10:07.
Скарам вне форума Ответить с цитированием
Старый 05.04.2018, 13:23   #4
Nezhniy
Пользователь
 
Регистрация: 05.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Скарам Посмотреть сообщение
Это классы для десериализации объектов
Код:
 public class Buy
        {
            public double Quantity { get; set; }
            public double Rate { get; set; }
        }

        public class Sell
        {
            public double Quantity { get; set; }
            public double Rate { get; set; }
        }

        public class Result
        {
            public List< Buy > buy { get; set; }
            public List< Sell > sell { get; set; }
        }

        public class QueryResult
        {
            public bool success { get; set; }

            public string message { get; set; }

            public Result result { get; set; }
        }
Это код десериализации
Код:
JsonConvert.DeserializeObject< QueryResult >( res );
Генерировал класс с помощью этого.
Хороший код генерируется здесь тырк

Скопировал код с генератора:

Код:
namespace Bittrex
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class BittrexValuta
    {
        [JsonProperty("success")]
        public bool Success { get; set; }

        [JsonProperty("message")]
        public string Message { get; set; }

        [JsonProperty("result")]
        public Result Result { get; set; }
    }

    public partial class Result
    {
        [JsonProperty("Bid")]
        public double Bid { get; set; }

        [JsonProperty("Ask")]
        public double Ask { get; set; }

        [JsonProperty("Last")]
        public double Last { get; set; }
    }

    public partial class BittrexValuta
    {
        public static BittrexValuta FromJson(string json) => JsonConvert.DeserializeObject<BittrexValuta>(json, Bittrex.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this BittrexValuta self) => JsonConvert.SerializeObject(self, Bittrex.Converter.Settings);
    }

    internal class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters = {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }
}

Сделал кнопку и текстбокс:

Код:
private void button1_Click(object sender, EventArgs e)
        {           
            
            string res = bitmex.Query("GET", "/public/getticker?market=USDT-BTC");

            JsonConvert.DeserializeObject<Result>(res);
            Result Qwert = new Result();
            Log.Text = "Получил данные:"+  Qwert.Ask;

        }
В текстбоксе получаю 0 . Что я делаю не так? Прошу прощения за возможно глупые вопросы, разбираюсь.
Nezhniy вне форума Ответить с цитированием
Старый 05.04.2018, 17:21   #5
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

app.quicktype сгенерировал тебе сериализатор и десериализатор. В твоем случае надо делать так:
Код:
 string res = bitmex.Query("GET", "/public/getticker?market=USDT-BTC");

           
           var test=  BittrexValuta.FromJson( res );
            Log.Text = "Получил данные:"+  test.Result.Ask;
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 06.04.2018, 13:44   #6
Nezhniy
Пользователь
 
Регистрация: 05.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Скарам Посмотреть сообщение
app.quicktype сгенерировал тебе сериализатор и десериализатор. В твоем случае надо делать так:
Код:
 string res = bitmex.Query("GET", "/public/getticker?market=USDT-BTC");

           
           var test=  BittrexValuta.FromJson( res );
            Log.Text = "Получил данные:"+  test.Result.Ask;
Всё заработало, спасибо. Я вот только всё никак с некоторыми простыми вещами не разберусь:

Код:
  
List<Bittrex_currencies.Result> Currencies = new List<Bittrex_currencies.Result>();

public void Poluchenie_Spiska_Valut()
        {
            string vse_valuti = bitmex.Query("GET", "/public/getcurrencies");
            BittrexVseValuti.FromJson(vse_valuti);
        }

        private void button1_Click(object sender, EventArgs e)
        {  

            Poluchenie_Spiska_Valut();

            Log.Text = "Получил данные:" +  Bittrex_currencies.Result.First().Ask;

        }
Вынес процедуру получения данных в лист отдельно. Вызываю её по кнопке. И хочу уже работать с данными листа как с массивом. Но не получается взять значения. Понимаю, что вопрос начального уровня, но никак не могу понять, почему не получается, если всё public.. Пожалуйста, объясните!
Nezhniy вне форума Ответить с цитированием
Старый 06.04.2018, 14:25   #7
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

В строке
Цитата:
BittrexVseValuti.FromJson(vse_valut i);
Ты десериализовал объект. И куда он он у тебя присваивается?
Думаю, что должно быть что-то вроде:
Код:
public void Poluchenie_Spiska_Valut()
        {
            string vse_valuti = bitmex.Query("GET", "/public/getcurrencies");
            var resultQuery= Bittrex_currencies.FromJson(vse_valuti);
            if(resultQuery.Success)
            {
               Currencies.Clear();
               Currencies.AddRange(resultQuery.Result);
             }
        }
Ты все время теряешь объект, который десериализовываешь,все время путаешь какие типы объектов к каким запросам относятся. К примеру,
Цитата:
bitmex.Query("GET", "/public/getcurrencies")
Возвращает объект, у которого нет поля Ask. На запрос /public/getcurrencies надо делать такую обработку
Код:
 private void button1_Click(object sender, EventArgs e)
        {  

            Poluchenie_Spiska_Valut();

            Log.Text = "Получил данные:" + Currencies.First().CoinType;

        }
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 06.04.2018, 15:00   #8
Nezhniy
Пользователь
 
Регистрация: 05.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Скарам Посмотреть сообщение
В строке
Ты десериализовал объект. И куда он он у тебя присваивается?
Думаю, что должно быть что-то вроде:
Код:
public void Poluchenie_Spiska_Valut()
        {
            string vse_valuti = bitmex.Query("GET", "/public/getcurrencies");
            var resultQuery= Bittrex_currencies.FromJson(vse_valuti);
            if(resultQuery.Success)
            {
               Currencies.Clear();
               Currencies.AddRange(resultQuery.Result);
             }
        }
Ты все время теряешь объект, который десериализовываешь,все время путаешь какие типы объектов к каким запросам относятся. К примеру, Возвращает объект, у которого нет поля Ask. На запрос /public/getcurrencies надо делать такую обработку
Код:
 private void button1_Click(object sender, EventArgs e)
        {  

            Poluchenie_Spiska_Valut();

            Log.Text = "Получил данные:" + Currencies.First().CoinType;

        }
Спасибо! Разобрался, получилось! А как вывести все Currencies.Ask в текстбокс для примера? Ну или еще точнее, мне нужно будет работать именно с массивом (это же получается double массив Ask в листе Currencies, правильно я понял?) , делать циклы для значений Ask, работать с ними. Что-то с List довольно очевидные вещи не получаются сразу вот так взять и сделать..
Nezhniy вне форума Ответить с цитированием
Старый 06.04.2018, 15:57   #9
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Учи матчасть
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 06.04.2018, 16:23   #10
Nezhniy
Пользователь
 
Регистрация: 05.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Скарам Посмотреть сообщение
Большое спасибо! Всё получилось!
Nezhniy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java. Ошибка. Компилируется, но не запускается. Ошибка duplicate class. Проблема не в коде. nevender Общие вопросы по Java, Java SE, Kotlin 2 13.02.2016 13:24
Где ошибка в этом исходном коде на языке Си? Или ошибка в Excel? ArchiCurtis Помощь студентам 2 07.04.2012 14:16
Ошибка при десериализации (End of Stream encountered before parsing was completed) dima_r C# (си шарп) 2 14.04.2011 11:52
Ошибка run-time Error 1004 общая ошибка ODBC kaval88 Microsoft Office Excel 0 27.02.2011 20:20
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58