Вы должны войти, чтобы создавать сообщения и темы.

Не могу разобраться с json

◄Страница 2 из 2

@dapofig всё таки у меня не получается это всё переписать под Windows Forms .NET Framework 4.8

Определения 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; }
    }
}

Скрин

Лайкнули Сергей, yuri и ещё 2
СергейyuriAlas NamelessЕвгений
Цитата: 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; }
    }
}

Примного благодарен за подробности! 🤝

Лайкнул Dapofig
Dapofig
◄Страница 2 из 2