Не могу разобраться с json
Цитата: Евгений от 26.01.2023, 14:52@dapofig всё таки у меня не получается это всё переписать под Windows Forms .NET Framework 4.8
@dapofig всё таки у меня не получается это всё переписать под Windows Forms .NET Framework 4.8
Цитата: Dapofig от 26.01.2023, 15:56Определения record заменяются обычными классами-моделями, вместо JsonSerializer используется JavaScriptSerializer (как оказалось, он даже не требует настройки для корректного маппинга).
[spoiler title="P.S."]Код демонстративный, в зависимости от архитектуры, модели лучше вынести в отдельные файлы и объединить в папку, а код отвечающий за работу с API инкапсулировать в отдельный сервис, чтобы форма лишь использовала сервис для получения нужной информации. Код из дизайнера вынес в форму, чтобы было понятнее, как отображается информация.[/spoiler]
[spoiler title="Код"]
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using System.Web.Script.Serialization; using System.Windows.Forms; namespace Parser { public partial class MainWindow : Form { private DataGridView dataGridView; private const string PRICE_URL = "https://www.binance.com/fapi/v1/ticker/price"; private const string EXCHANGE_INFO_URL = "https://www.binance.com/fapi/v1/exchangeInfo"; private const decimal WORK_AMOUNT = 5; public MainWindow() { dataGridView = new DataGridView { Name = "dataGridView", Location = new System.Drawing.Point(0, 0), Size = new System.Drawing.Size(700, 400), ColumnCount = 4 }; dataGridView.Columns[0].Name = "Symbol"; dataGridView.Columns[1].Name = "Step"; dataGridView.Columns[2].Name = "Rounded"; dataGridView.Columns[3].Name = "Initial"; ClientSize = new System.Drawing.Size(700, 400); Controls.Add(dataGridView); Load += new EventHandler(MainWindow_Load); } private async void MainWindow_Load(object sender, EventArgs e) { var exchangeModel = await Request<ExchangeModel>(EXCHANGE_INFO_URL); var priceModels = await Request<IEnumerable<PriceModel>>(PRICE_URL); foreach (var model in priceModels) { var step = exchangeModel.Symbols .First(x => x.Symbol == model.Symbol).Filters .First(x => x.FilterType == "LOT_SIZE").StepSize; var initial = WORK_AMOUNT / model.Price; var rounded = Round(initial, step); dataGridView.Rows.Add(new[] { model.Symbol, step.ToString(), rounded.ToString(), initial.ToString() }); } } private static decimal Round(decimal number, decimal step) { return Math.Floor(number / step) * step; } private static async Task<T> Request<T>(string url) { using (var client = new HttpClient()) { var response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return Deserialize<T>(json); } } private static T Deserialize<T>(string json) { var serializer = new JavaScriptSerializer(); return serializer.Deserialize<T>(json); } } class PriceModel { public string Symbol { get; set; } public decimal Price { get; set; } } class ExchangeModel { public IEnumerable<SymbolModel> Symbols { get; set; } } class SymbolModel { public string Symbol { get; set; } public IEnumerable<FilterModel> Filters { get; set; } } class FilterModel { public string FilterType { get; set; } public decimal StepSize { get; set; } } }[/spoiler]
Определения record заменяются обычными классами-моделями, вместо JsonSerializer используется JavaScriptSerializer (как оказалось, он даже не требует настройки для корректного маппинга).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows.Forms;
namespace Parser
{
public partial class MainWindow : Form
{
private DataGridView dataGridView;
private const string PRICE_URL = "https://www.binance.com/fapi/v1/ticker/price";
private const string EXCHANGE_INFO_URL = "https://www.binance.com/fapi/v1/exchangeInfo";
private const decimal WORK_AMOUNT = 5;
public MainWindow()
{
dataGridView = new DataGridView
{
Name = "dataGridView",
Location = new System.Drawing.Point(0, 0),
Size = new System.Drawing.Size(700, 400),
ColumnCount = 4
};
dataGridView.Columns[0].Name = "Symbol";
dataGridView.Columns[1].Name = "Step";
dataGridView.Columns[2].Name = "Rounded";
dataGridView.Columns[3].Name = "Initial";
ClientSize = new System.Drawing.Size(700, 400);
Controls.Add(dataGridView);
Load += new EventHandler(MainWindow_Load);
}
private async void MainWindow_Load(object sender, EventArgs e)
{
var exchangeModel = await Request<ExchangeModel>(EXCHANGE_INFO_URL);
var priceModels = await Request<IEnumerable<PriceModel>>(PRICE_URL);
foreach (var model in priceModels)
{
var step = exchangeModel.Symbols
.First(x => x.Symbol == model.Symbol).Filters
.First(x => x.FilterType == "LOT_SIZE").StepSize;
var initial = WORK_AMOUNT / model.Price;
var rounded = Round(initial, step);
dataGridView.Rows.Add(new[] {
model.Symbol,
step.ToString(),
rounded.ToString(),
initial.ToString()
});
}
}
private static decimal Round(decimal number, decimal step)
{
return Math.Floor(number / step) * step;
}
private static async Task<T> Request<T>(string url)
{
using (var client = new HttpClient())
{
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return Deserialize<T>(json);
}
}
private static T Deserialize<T>(string json)
{
var serializer = new JavaScriptSerializer();
return serializer.Deserialize<T>(json);
}
}
class PriceModel
{
public string Symbol { get; set; }
public decimal Price { get; set; }
}
class ExchangeModel
{
public IEnumerable<SymbolModel> Symbols { get; set; }
}
class SymbolModel
{
public string Symbol { get; set; }
public IEnumerable<FilterModel> Filters { get; set; }
}
class FilterModel
{
public string FilterType { get; set; }
public decimal StepSize { get; set; }
}
}
Цитата: Евгений от 26.01.2023, 16:15Цитата: Dapofig от 26.01.2023, 15:56Определения record заменяются обычными классами-моделями, вместо JsonSerializer используется JavaScriptSerializer (как оказалось, он даже не требует настройки для корректного маппинга).
[spoiler title="P.S."]Код демонстративный, в зависимости от архитектуры, модели лучше вынести в отдельные файлы и объединить в папку, а код отвечающий за работу с API инкапсулировать в отдельный сервис, чтобы форма лишь использовала сервис для получения нужной информации. Код из дизайнера вынес в форму, чтобы было понятнее, как отображается информация.[/spoiler]
[spoiler title="Код"]
using System;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.Threading.Tasks;using System.Web.Script.Serialization;using System.Windows.Forms;namespace Parser{public partial class MainWindow : Form{private DataGridView dataGridView;private const string PRICE_URL = "https://www.binance.com/fapi/v1/ticker/price";private const string EXCHANGE_INFO_URL = "https://www.binance.com/fapi/v1/exchangeInfo";private const decimal WORK_AMOUNT = 5;public MainWindow(){dataGridView = new DataGridView{Name = "dataGridView",Location = new System.Drawing.Point(0, 0),Size = new System.Drawing.Size(700, 400),ColumnCount = 4};dataGridView.Columns[0].Name = "Symbol";dataGridView.Columns[1].Name = "Step";dataGridView.Columns[2].Name = "Rounded";dataGridView.Columns[3].Name = "Initial";ClientSize = new System.Drawing.Size(700, 400);Controls.Add(dataGridView);Load += new EventHandler(MainWindow_Load);}private async void MainWindow_Load(object sender, EventArgs e){var exchangeModel = await Request<ExchangeModel>(EXCHANGE_INFO_URL);var priceModels = await Request<IEnumerable<PriceModel>>(PRICE_URL);foreach (var model in priceModels){var step = exchangeModel.Symbols.First(x => x.Symbol == model.Symbol).Filters.First(x => x.FilterType == "LOT_SIZE").StepSize;var initial = WORK_AMOUNT / model.Price;var rounded = Round(initial, step);dataGridView.Rows.Add(new[] {model.Symbol,step.ToString(),rounded.ToString(),initial.ToString()});}}private static decimal Round(decimal number, decimal step){return Math.Floor(number / step) * step;}private static async Task<T> Request<T>(string url){using (var client = new HttpClient()){var response = await client.GetAsync(url);response.EnsureSuccessStatusCode();var json = await response.Content.ReadAsStringAsync();return Deserialize<T>(json);}}private static T Deserialize<T>(string json){var serializer = new JavaScriptSerializer();return serializer.Deserialize<T>(json);}}class PriceModel{public string Symbol { get; set; }public decimal Price { get; set; }}class ExchangeModel{public IEnumerable<SymbolModel> Symbols { get; set; }}class SymbolModel{public string Symbol { get; set; }public IEnumerable<FilterModel> Filters { get; set; }}class FilterModel{public string FilterType { get; set; }public decimal StepSize { get; set; }}}using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using System.Web.Script.Serialization; using System.Windows.Forms; namespace Parser { public partial class MainWindow : Form { private DataGridView dataGridView; private const string PRICE_URL = "https://www.binance.com/fapi/v1/ticker/price"; private const string EXCHANGE_INFO_URL = "https://www.binance.com/fapi/v1/exchangeInfo"; private const decimal WORK_AMOUNT = 5; public MainWindow() { dataGridView = new DataGridView { Name = "dataGridView", Location = new System.Drawing.Point(0, 0), Size = new System.Drawing.Size(700, 400), ColumnCount = 4 }; dataGridView.Columns[0].Name = "Symbol"; dataGridView.Columns[1].Name = "Step"; dataGridView.Columns[2].Name = "Rounded"; dataGridView.Columns[3].Name = "Initial"; ClientSize = new System.Drawing.Size(700, 400); Controls.Add(dataGridView); Load += new EventHandler(MainWindow_Load); } private async void MainWindow_Load(object sender, EventArgs e) { var exchangeModel = await Request<ExchangeModel>(EXCHANGE_INFO_URL); var priceModels = await Request<IEnumerable<PriceModel>>(PRICE_URL); foreach (var model in priceModels) { var step = exchangeModel.Symbols .First(x => x.Symbol == model.Symbol).Filters .First(x => x.FilterType == "LOT_SIZE").StepSize; var initial = WORK_AMOUNT / model.Price; var rounded = Round(initial, step); dataGridView.Rows.Add(new[] { model.Symbol, step.ToString(), rounded.ToString(), initial.ToString() }); } } private static decimal Round(decimal number, decimal step) { return Math.Floor(number / step) * step; } private static async Task<T> Request<T>(string url) { using (var client = new HttpClient()) { var response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return Deserialize<T>(json); } } private static T Deserialize<T>(string json) { var serializer = new JavaScriptSerializer(); return serializer.Deserialize<T>(json); } } class PriceModel { public string Symbol { get; set; } public decimal Price { get; set; } } class ExchangeModel { public IEnumerable<SymbolModel> Symbols { get; set; } } class SymbolModel { public string Symbol { get; set; } public IEnumerable<FilterModel> Filters { get; set; } } class FilterModel { public string FilterType { get; set; } public decimal StepSize { get; set; } } }using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using System.Web.Script.Serialization; using System.Windows.Forms; namespace Parser { public partial class MainWindow : Form { private DataGridView dataGridView; private const string PRICE_URL = "https://www.binance.com/fapi/v1/ticker/price"; private const string EXCHANGE_INFO_URL = "https://www.binance.com/fapi/v1/exchangeInfo"; private const decimal WORK_AMOUNT = 5; public MainWindow() { dataGridView = new DataGridView { Name = "dataGridView", Location = new System.Drawing.Point(0, 0), Size = new System.Drawing.Size(700, 400), ColumnCount = 4 }; dataGridView.Columns[0].Name = "Symbol"; dataGridView.Columns[1].Name = "Step"; dataGridView.Columns[2].Name = "Rounded"; dataGridView.Columns[3].Name = "Initial"; ClientSize = new System.Drawing.Size(700, 400); Controls.Add(dataGridView); Load += new EventHandler(MainWindow_Load); } private async void MainWindow_Load(object sender, EventArgs e) { var exchangeModel = await Request<ExchangeModel>(EXCHANGE_INFO_URL); var priceModels = await Request<IEnumerable<PriceModel>>(PRICE_URL); foreach (var model in priceModels) { var step = exchangeModel.Symbols .First(x => x.Symbol == model.Symbol).Filters .First(x => x.FilterType == "LOT_SIZE").StepSize; var initial = WORK_AMOUNT / model.Price; var rounded = Round(initial, step); dataGridView.Rows.Add(new[] { model.Symbol, step.ToString(), rounded.ToString(), initial.ToString() }); } } private static decimal Round(decimal number, decimal step) { return Math.Floor(number / step) * step; } private static async Task<T> Request<T>(string url) { using (var client = new HttpClient()) { var response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return Deserialize<T>(json); } } private static T Deserialize<T>(string json) { var serializer = new JavaScriptSerializer(); return serializer.Deserialize<T>(json); } } class PriceModel { public string Symbol { get; set; } public decimal Price { get; set; } } class ExchangeModel { public IEnumerable<SymbolModel> Symbols { get; set; } } class SymbolModel { public string Symbol { get; set; } public IEnumerable<FilterModel> Filters { get; set; } } class FilterModel { public string FilterType { get; set; } public decimal StepSize { get; set; } } }[/spoiler]
[spoiler title="Скрин"]<img class="lazyload" src="data:;base64," alt="" width="493" height="396" data-orig-src="https://i.imgur.com/LH2k2xZ.png" />[/spoiler]
Примного благодарен за подробности! 🤝
Цитата: Dapofig от 26.01.2023, 15:56Определения record заменяются обычными классами-моделями, вместо JsonSerializer используется JavaScriptSerializer (как оказалось, он даже не требует настройки для корректного маппинга).
P.S.Код демонстративный, в зависимости от архитектуры, модели лучше вынести в отдельные файлы и объединить в папку, а код отвечающий за работу с API инкапсулировать в отдельный сервис, чтобы форма лишь использовала сервис для получения нужной информации. Код из дизайнера вынес в форму, чтобы было понятнее, как отображается информация.Кодusing System;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.Threading.Tasks;using System.Web.Script.Serialization;using System.Windows.Forms;namespace Parser{public partial class MainWindow : Form{private DataGridView dataGridView;private const string PRICE_URL = "https://www.binance.com/fapi/v1/ticker/price";private const string EXCHANGE_INFO_URL = "https://www.binance.com/fapi/v1/exchangeInfo";private const decimal WORK_AMOUNT = 5;public MainWindow(){dataGridView = new DataGridView{Name = "dataGridView",Location = new System.Drawing.Point(0, 0),Size = new System.Drawing.Size(700, 400),ColumnCount = 4};dataGridView.Columns[0].Name = "Symbol";dataGridView.Columns[1].Name = "Step";dataGridView.Columns[2].Name = "Rounded";dataGridView.Columns[3].Name = "Initial";ClientSize = new System.Drawing.Size(700, 400);Controls.Add(dataGridView);Load += new EventHandler(MainWindow_Load);}private async void MainWindow_Load(object sender, EventArgs e){var exchangeModel = await Request<ExchangeModel>(EXCHANGE_INFO_URL);var priceModels = await Request<IEnumerable<PriceModel>>(PRICE_URL);foreach (var model in priceModels){var step = exchangeModel.Symbols.First(x => x.Symbol == model.Symbol).Filters.First(x => x.FilterType == "LOT_SIZE").StepSize;var initial = WORK_AMOUNT / model.Price;var rounded = Round(initial, step);dataGridView.Rows.Add(new[] {model.Symbol,step.ToString(),rounded.ToString(),initial.ToString()});}}private static decimal Round(decimal number, decimal step){return Math.Floor(number / step) * step;}private static async Task<T> Request<T>(string url){using (var client = new HttpClient()){var response = await client.GetAsync(url);response.EnsureSuccessStatusCode();var json = await response.Content.ReadAsStringAsync();return Deserialize<T>(json);}}private static T Deserialize<T>(string json){var serializer = new JavaScriptSerializer();return serializer.Deserialize<T>(json);}}class PriceModel{public string Symbol { get; set; }public decimal Price { get; set; }}class ExchangeModel{public IEnumerable<SymbolModel> Symbols { get; set; }}class SymbolModel{public string Symbol { get; set; }public IEnumerable<FilterModel> Filters { get; set; }}class FilterModel{public string FilterType { get; set; }public decimal StepSize { get; set; }}}using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using System.Web.Script.Serialization; using System.Windows.Forms; namespace Parser { public partial class MainWindow : Form { private DataGridView dataGridView; private const string PRICE_URL = "https://www.binance.com/fapi/v1/ticker/price"; private const string EXCHANGE_INFO_URL = "https://www.binance.com/fapi/v1/exchangeInfo"; private const decimal WORK_AMOUNT = 5; public MainWindow() { dataGridView = new DataGridView { Name = "dataGridView", Location = new System.Drawing.Point(0, 0), Size = new System.Drawing.Size(700, 400), ColumnCount = 4 }; dataGridView.Columns[0].Name = "Symbol"; dataGridView.Columns[1].Name = "Step"; dataGridView.Columns[2].Name = "Rounded"; dataGridView.Columns[3].Name = "Initial"; ClientSize = new System.Drawing.Size(700, 400); Controls.Add(dataGridView); Load += new EventHandler(MainWindow_Load); } private async void MainWindow_Load(object sender, EventArgs e) { var exchangeModel = await Request<ExchangeModel>(EXCHANGE_INFO_URL); var priceModels = await Request<IEnumerable<PriceModel>>(PRICE_URL); foreach (var model in priceModels) { var step = exchangeModel.Symbols .First(x => x.Symbol == model.Symbol).Filters .First(x => x.FilterType == "LOT_SIZE").StepSize; var initial = WORK_AMOUNT / model.Price; var rounded = Round(initial, step); dataGridView.Rows.Add(new[] { model.Symbol, step.ToString(), rounded.ToString(), initial.ToString() }); } } private static decimal Round(decimal number, decimal step) { return Math.Floor(number / step) * step; } private static async Task<T> Request<T>(string url) { using (var client = new HttpClient()) { var response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return Deserialize<T>(json); } } private static T Deserialize<T>(string json) { var serializer = new JavaScriptSerializer(); return serializer.Deserialize<T>(json); } } class PriceModel { public string Symbol { get; set; } public decimal Price { get; set; } } class ExchangeModel { public IEnumerable<SymbolModel> Symbols { get; set; } } class SymbolModel { public string Symbol { get; set; } public IEnumerable<FilterModel> Filters { get; set; } } class FilterModel { public string FilterType { get; set; } public decimal StepSize { get; set; } } }using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using System.Web.Script.Serialization; using System.Windows.Forms; namespace Parser { public partial class MainWindow : Form { private DataGridView dataGridView; private const string PRICE_URL = "https://www.binance.com/fapi/v1/ticker/price"; private const string EXCHANGE_INFO_URL = "https://www.binance.com/fapi/v1/exchangeInfo"; private const decimal WORK_AMOUNT = 5; public MainWindow() { dataGridView = new DataGridView { Name = "dataGridView", Location = new System.Drawing.Point(0, 0), Size = new System.Drawing.Size(700, 400), ColumnCount = 4 }; dataGridView.Columns[0].Name = "Symbol"; dataGridView.Columns[1].Name = "Step"; dataGridView.Columns[2].Name = "Rounded"; dataGridView.Columns[3].Name = "Initial"; ClientSize = new System.Drawing.Size(700, 400); Controls.Add(dataGridView); Load += new EventHandler(MainWindow_Load); } private async void MainWindow_Load(object sender, EventArgs e) { var exchangeModel = await Request<ExchangeModel>(EXCHANGE_INFO_URL); var priceModels = await Request<IEnumerable<PriceModel>>(PRICE_URL); foreach (var model in priceModels) { var step = exchangeModel.Symbols .First(x => x.Symbol == model.Symbol).Filters .First(x => x.FilterType == "LOT_SIZE").StepSize; var initial = WORK_AMOUNT / model.Price; var rounded = Round(initial, step); dataGridView.Rows.Add(new[] { model.Symbol, step.ToString(), rounded.ToString(), initial.ToString() }); } } private static decimal Round(decimal number, decimal step) { return Math.Floor(number / step) * step; } private static async Task<T> Request<T>(string url) { using (var client = new HttpClient()) { var response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return Deserialize<T>(json); } } private static T Deserialize<T>(string json) { var serializer = new JavaScriptSerializer(); return serializer.Deserialize<T>(json); } } class PriceModel { public string Symbol { get; set; } public decimal Price { get; set; } } class ExchangeModel { public IEnumerable<SymbolModel> Symbols { get; set; } } class SymbolModel { public string Symbol { get; set; } public IEnumerable<FilterModel> Filters { get; set; } } class FilterModel { public string FilterType { get; set; } public decimal StepSize { get; set; } } }
Примного благодарен за подробности! 🤝
