С сервера в json приходят данные, которые в зависимости от метода запроса после десериализации записываются в:
public class OrderBookREST
{
public List<BidDelta> bid { get; set; }
public List<AskDelta> ask { get; set; }
public int sequence { get; set; }
}
или при другом методе запроса в:
public class OrderBookSocket
{
public List<BidDelta> bidDeltas { get; set; }
public List<AskDelta> askDeltas { get; set; }
public int sequence { get; set; }
}
в дальнейшем код работы с классами одинаков. Можно ли как-то атрибутами сделать один класс?
Здравствуйте, Farsight, Вы писали:
F>Здравствуйте, Passerby, Вы писали:
F>Первое, что пришло в голову: пропишите в класс все варианты для правильной десирализации и добавьте новое свойство, типа:
F>
Здравствуйте, Farsight, Вы писали:
F>Здравствуйте, Passerby, Вы писали:
P>>Спасибо. Кажется можно и оставить название свойства одним из существующих, к примеру: P>>
P>>bid => bid ?? bidDeltas;
P>>
P>>Как считаете?
F>Не получится .
Все равно не получается. Надо чтобы в классе были оба свойства:
public class OrderBookExample
{
public List<BidDelta> bid { get; set; }//если закомментировать пишет "Имя bid не существует в текущем контексте"public List<BidDelta> bidDeltas { get; set; }
[JsonIgnore]
public List<BidDelta> Bids => bid ?? bidDeltas;
}
Здравствуйте, Passerby, Вы писали:
P>С сервера в json приходят данные, которые в зависимости от метода запроса после сериализации записываются в: P>public class OrderBookREST P> { P> public List<BidDelta> bid { get; set; } P> public List<AskDelta> ask { get; set; } P> public int sequence { get; set; } P> } P>или при другом методе запроса в:
P>public class OrderBookSocket P> { P> public List<BidDelta> bidDeltas { get; set; } P> public List<AskDelta> askDeltas { get; set; } P> public int sequence { get; set; } P> } P>в дальнейшем код работы с классами одинаков. Можно ли как-то атрибутами сделать один класс?
Какими атрибутами? Что мешает просто использовать один класс? Какой именно сериализатор имеется в виду?
Здравствуйте, Farsight, Вы писали:
F>Здравствуйте, Passerby, Вы писали:
P>>А хотелось бы один класс с тем же числом свойств.
F>Ну это подход "в лоб". Если сильно хочется, то возьмите Json.NET и напишите кастомный конвертер. В интеренетах есть примеры.
Создал для примера:
public class OrderBookExample1
{
public string bid { get; set; }
public string bidDeltas { get; set; }
[JsonIgnore]
public string Bids => bid ?? bidDeltas;
}
Код:
OrderBookExample1 obe = new() { bid = "bid", bidDeltas = "bidDeltas" };
string s = obe.Bids;//"bid"
s = "bid" потому что первым объявлено в классе или зависит от компилятора? Хотя код работает т.к. если bid = null, Bids = "bidDeltas", но непонятно это соответствует какой-то спецификации или такая случайная реализация.
P>OrderBookExample1 obe = new() { bid = "bid", bidDeltas = "bidDeltas" };
P>string s = obe.Bids;//"bid"
P>
P>s = "bid" потому что первым объявлено в классе или зависит от компилятора? Хотя код работает т.к. если bid = null, Bids = "bidDeltas", но непонятно это соответствует какой-то спецификации или такая случайная реализация.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Какими атрибутами? Что мешает просто использовать один класс? Какой именно сериализатор имеется в виду?
А как сделать один класс если в строке которая десериализуется в одном случае "bid" в другом "bidDeltas". Какой класс для десериализации?
Newtonsoft.Json
Здравствуйте, Passerby, Вы писали:
P>А как сделать один класс если в строке которая десериализуется в одном случае "bid" в другом "bidDeltas". Какой класс для десериализации?
Синонимы для одного поля? Нет, в Json.Net такого из коробки нет. Можно сделать самому через кастомный конвертер. Но в данном случае семантика этих полей все таки разная, не смотря на формальное совпадение типа, так что я оставил бы два разных класса.
public class OrderBookExample
{
public List<BidDelta> bid { get; set; }
public List<BidDelta> bidDeltas { get { return bid; } set { bid = value; } }
}
или, на всякий случай:
public class OrderBookExample
{
private List<BidDelta> _bid;
public List<BidDelta> bid { get { return _bid; } set { _bid = value; } }
public List<BidDelta> bidDeltas { get { return _bid; } set { _bid = value; } }
}
Здравствуйте, Passerby, Вы писали:
P>в дальнейшем код работы с классами одинаков. Можно ли как-то атрибутами сделать один класс?
Я бы оставил их как контракты, а для BL ввел свою модель (куда и копировал бы данные из контрактов после получения).
В результате, BL бы не зависила от того, что придет в голову авторам API откуда берутся данные.
Здравствуйте, varenikAA, Вы писали:
AA>Здравствуйте, Passerby, Вы писали:
P>>С сервера в json приходят данные, которые в зависимости от метода запроса после десериализации записываются в: AA>
AA>в зависимости от метода запроса
Не понял, что не так? Формат данных зависит от того, каким образом происходит запрос с сервера: либо обработка подписанного потока по вебсокету, либо запрос через HttpClient.