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

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

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

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

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

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

Добрый день, уважаемые форумчане!

Пытаюсь десериализовать API данные.

Код:
{
  "server_time": 1523094103,
  "pairs": {
    "btc_usd": {
      "decimal_places": 3,
      "min_price": 0.1,
      "max_price": 500000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    },
    "btc_rur": {
      "decimal_places": 5,
      "min_price": 1,
      "max_price": 30000000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    },
    "btc_eur": {
      "decimal_places": 5,
      "min_price": 0.1,
      "max_price": 500000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    }, //... и т.д.
  }
}
Если загонять этот код в конструктор , то создает классы этих самых пар (btc_rur и т.д.) , что уже само по себе некрасиво. Так как пары периодически исчезают и могут добавляться, то как избежать ошибок? Вообще, из этих данных мне нужно получить ТОЛЬКО название этих пар, загнать их в List, возможно есть способ попроще?
Nezhniy вне форума Ответить с цитированием
Старый 07.04.2018, 15:36   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

как-то так:
Код:
var json = "..."; // строка с json-данными
var jObject = Newtonsoft.Json.Linq.JObject.Parse(json);
var pairs = jObject["pairs"].Select(pair => ((Newtonsoft.Json.Linq.JProperty)pair).Name).ToList();
pu4koff вне форума Ответить с цитированием
Старый 07.04.2018, 16:04   #3
Nezhniy
Пользователь
 
Регистрация: 05.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
как-то так:
Код:
var json = "..."; // строка с json-данными
var jObject = Newtonsoft.Json.Linq.JObject.Parse(json);
var pairs = jObject["pairs"].Select(pair => ((Newtonsoft.Json.Linq.JProperty)pair).Name).ToList();
Получилось, спасибо!

Но всё же вопрос оказался тем же, только для следующей ситуации.

Когда я работал с другим API , было всё понятно:

Код:
{
  "MarketName": "BTC-ABY",
  "High": 8.4e-7,
  "Low": 7.9e-7,
  "Volume": 3375501.27147736,
  "Last": 8.2e-7,
  "BaseVolume": 2.73193397,
  "TimeStamp": "2018-04-07T12:57:01.207",
  "Bid": 8.1e-7,
  "Ask": 8.3e-7,
  "OpenBuyOrders": 183,
  "OpenSellOrders": 1625,
  "PrevDay": 8e-7,
  "Created": "2014-10-31T01:43:25.743"
}
Я кидал всё в лист и обращался к Currency.MarketName , Currency.Ask и всё было ок.

Тут же другая структура.

Код:
{
  "btc_usd": {
    "high": 6999.88,
    "low": 6690,
    "avg": 6844.94,
    "vol": 5881311.61459,
    "vol_cur": 859.39993,
    "last": 6975.006,
    "buy": 6975.01,
    "sell": 6964.75,
    "updated": 1523105521
  },
  "btc_rur": {
    "high": 394913,
    "low": 379367.7492,
    "avg": 387140.3746,
    "vol": 131509803.52415,
    "vol_cur": 339.58506,
    "last": 393295.50569,
    "buy": 394659.999,
    "sell": 391931.01238,
    "updated": 1523105521
  },
  "ethet_eth": {
    "high": 0.68,
    "low": 0.665,
    "avg": 0.6725,
    "vol": 80.74506,
    "vol_cur": 121.01729,
    "last": 0.67,
    "buy": 0.674,
    "sell": 0.67,
    "updated": 1523105522
  }
}
Конструктором он создаёт отдельный класс по каждой найденной паре:

Код:
 public partial class ExmoVseValuti
    {
        [JsonProperty("btc_usd")]
        public BtcUsd BtcUsd { get; set; }

        [JsonProperty("btc_rur")]
        public BtcRur BtcRur { get; set; }

        [JsonProperty("ethet_eth")]
        public EthetEth EthetEth { get; set; }
    }
public partial class BtcRur
    {
        [JsonProperty("high")]
        public long High { get; set; }

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

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

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

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

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

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

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

        [JsonProperty("updated")]
        public long Updated { get; set; }
    }

    public partial class BtcUsd
    {
        [JsonProperty("high")]
        public double High { get; set; }

        [JsonProperty("low")]
        public long Low { get; set; }

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

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

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

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

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

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

        [JsonProperty("updated")]
        public long Updated { get; set; }
    }
Выглядит как-то очень неправильно и как потом работать с этим, вообще непонятно. Это разработчики API второй биржи так криво сделали структуру или я чего-то не понимаю? Возможно ли привести к виду первой биржи?
Nezhniy вне форума Ответить с цитированием
Старый 07.04.2018, 16:10   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Очередная тема... Нет одного стандарта на апи и на формат возвращаемых данных. Как вам уже говорили - да, для каждой биржи прийдется делать свой парсер и загонять данные в свою общую структуру, если вам это надо.
p51x вне форума Ответить с цитированием
Старый 07.04.2018, 17:21   #5
Nezhniy
Пользователь
 
Регистрация: 05.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Очередная тема... Нет одного стандарта на апи и на формат возвращаемых данных. Как вам уже говорили - да, для каждой биржи прийдется делать свой парсер и загонять данные в свою общую структуру, если вам это надо.
Всегда пытаюсь во всём разобраться сам и крайне редко сюда писать. Что поделать, если встречаешься с ситуациями, которые значительно отличаются от мануалок и примеров, встаешь в тупик. Форум же даёт направление на развитие семимильными шагами.

Вот классический пример:

Код:
public class Person
{
 [JsonProperty(PropertyName = "firstname")]
 public string FirstName { get; set;}

 [JsonProperty(PropertyName = "secondname")]
 public string SecondName { get; set;}
}
Здесь есть названия у PropertyName . Если бы у этой биржи был классический вид: Currency:BTC , BID:6000, ASK:7000 - всё понятно, вопросов нет.

Но тут:

Код:
{"btc_usd":{"high":6999.88,"low":6690.01,"avg":6844.945,"vol":5893096.46397,"vol_cur":858.62593,"last":6946.02,"buy":6976.99,"sell":6946.02,"updated":1523109962},
и этот самый PropertyName не задашь у переменной названия валюты в структуре, он постоянно меняется. Вот и не понимаю, как мне сделать структуру и десериализовать в объекты в данном случае.. Возможно туплю, не вижу очевидного.

Последний раз редактировалось Nezhniy; 07.04.2018 в 17:31.
Nezhniy вне форума Ответить с цитированием
Старый 07.04.2018, 18:34   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Я же уже писал.
Для себя создаём удобную структуру классов (Model) под свою задачу. Плевать чего там на каких биржах происходит. Просто с нуля создаём классы, исходя из предметной области. Для отображения данных в окошках делаем еще классы (ViewModel). Для небольших задач можно ограничиться Model и её же использовать как ViewModel. https://ru.wikipedia.org/wiki/Model-View-ViewModel
Для каждой биржи уже создаём отдельные классы генератором или вручную и соответственно разбираемся как их преобразовать в свои удобные.
В данном случае нужно исходить из логики, что завтра любая биржа может переименовать какое-то свойство или добавить что-то новое, а то и вовсе перейти на xml.
Волшебства не существует, поэтому придётся таки разобраться как от данной биржи получить аналог значения Ask, как сопоставить BTC-USD с btc_usd и т.д. и т.п. Может повезёт и Newtonsoft.Json сам всё сделает, а может придётся написать свой конвертер для Json, высчитать самостоятельно Ask на основе других значений или еще как заморочиться.
pu4koff вне форума Ответить с цитированием
Старый 07.04.2018, 19:47   #7
Nezhniy
Пользователь
 
Регистрация: 05.11.2013
Сообщений: 22
По умолчанию

Всем спасибо, решение нашел!
Nezhniy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Десериализация объекта Владимрл C# (си шарп) 6 07.05.2016 15:27
десериализация DefaultListModel yulia Общие вопросы по Java, Java SE, Kotlin 1 29.12.2015 16:39
Десериализация alexa2352 Microsoft Office Excel 2 22.06.2012 18:16
Десериализация Selestis Общие вопросы C/C++ 6 02.02.2011 16:02
сериализация и десериализация radiantor Работа с сетью в Delphi 7 02.08.2008 00:27