Пользовательский конвертер JSON C# WPF для «Массива объектов» в «Массив массивов» на сервер PythonC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Пользовательский конвертер JSON C# WPF для «Массива объектов» в «Массив массивов» на сервер Python

Сообщение Anonymous »


Всем добрый вечер.

У меня есть приложение C# WPF, которому необходимо отправлять запросы JSON на сервер Python, который работает совершенно отдельно от этой программы. Я уже установил успешную связь через ListBox, наблюдаемую коллекцию и JsonSerializer, как показано ниже:

попробуй { // PeekSignalsList — это ObservableCollection СтрингКонтент? jsonString = новый StringContent( JsonConvert.SerializeObject(PeekSignalsList, Formatting.Indented), Кодировка.UTF8, новый MediaTypeHeaderValue("application/json")); если (jsonString не равно нулю) { Client.DefaultRequestHeaders.Clear(); Client.DefaultRequestHeaders.Add("host", $"{ServerAddress}"); Client.DefaultRequestHeaders.Add("пользовательский агент", "python-requests/2.31.0"); Client.DefaultRequestHeaders.Add("accept-encoding", "gzip, deflate"); Client.DefaultRequestHeaders.Add("принять", "*/*"); Client.DefaultRequestHeaders.Add("соединение", "поддержание активности"); Client.DefaultRequestHeaders.TryAddWithoutValidation("тип содержимого", "application/json"); // это работает отлично запрос var = новый System.Net.Http.HttpRequestMessage { Метод = System.Net.Http.HttpMethod.Get, RequestUri = новый Uri($"http://{ServerAddress}/peek_data"), Содержимое = jsonString, }; ответ вар = ждут Client.SendAsync(запрос).ConfigureAwait(false); ответ.EnsureSuccessStatusCode(); вар responseBody = ожидайте ответа.Content.ReadAsStringAsync().ConfigureAwait(false); } еще { PeekLog += $"ECI-PeekOneShot:\tJson сериализация вернула значение null{Environment.NewLine}"; } } У меня есть еще один элемент управления ListView, в котором есть два поля, привязанные к другой ObservableCollection типа PokeSignal. Когда я использую тот же подход, что и выше, я получаю разницу в том, что видит Wireshark, как показано на рисунках ниже. Из-за этого сервер отклоняет мои запросы.

Ниже приведено изображение из Wireshark того, что тестовый скрипт Python отправляет на сервер Python.
Изображение


А вот изображение из Wireshark того, что моя программа C# отправляет на сервер Python.
Изображение


Я знаю, что мне нужен собственный сериализатор Json, и я попытался создать его, используя этот и некоторые другие ресурсы. Я никогда раньше этого не делал, поэтому немного застрял в том, как заставить Json Converter создать «Массив массивов» на картинке.

Вот мой PokeSignal.cs

пространство имен EngineeringLabUi.Models { [JsonConverter(typeof(PokeSignalJsonConverter))] публичный класс PokeSignal { public PokeSignal (строка? signalName, int? signalValue) { Имя сигнала = Имя сигнала; Значение Сигнала = Значение Сигнала; } публичный PokeSignal() { Имя_сигнала = строка.Пусто; СигналЗначение = 0; } // не знаю, что здесь делать публичная строка переопределения ToString() => $"{SignalName}:{SignalValue}"; общедоступный статический анализ PokeSignal (строковый ввод) { // не знаю, что здесь делать значение int = int.Parse(input.Substring(0, input.Length - 1)); имя строки = ввод; вернуть новый PokeSignal(имя, значение); } общедоступная строка? Имя_сигнала {получить; набор; } публичный интервал? SignalValue {получить; набор; } } } А вот мой конвертер, созданный по ссылке выше:

пространство имен EngineeringLabUi.Converters { общедоступный класс PokeSignalJsonConverter: JsonConverter { публичное переопределение PokeSignal? ReadJson(читатель JsonReader, Тип объектаТип, ПокеСигнал? существующее значение, логическое значениеExistingValue, Сериализатор Newtonsoft.Json.JsonSerializer) { return PokeSignal.Parse(reader.ToString()!); } публичное переопределение void WriteJson (писатель JsonWriter, ПокеСигнал? ценить, Сериализатор Newtonsoft.Json.JsonSerializer) { писатель.WriteRaw(значение?.ToString()); } } } По ссылке выше также создан следующий код, в котором я пытаюсь использовать конвертер, но также получаю ошибку:

попробуй { var serializeOptions = новый JsonSerializerOptions { WriteIndented = правда, Конвертеры = { /* Ошибка: невозможно преобразовать из «EngineeringLabUi.Converters.PokeSignalJsonConverter» в * 'System.Text.Json.Serialization.JsonConverter' * * Ошибка: лучший перегруженный метод добавления «ICollection.Add(JsonConverter)». * поскольку инициализатор коллекции имеет недопустимые аргументы */ новый PokeSignalJsonConverter() } }; СтрингКонтент? jsonString = новый StringContent( JsonConvert.SerializeObject(PokeSignalsList, Formatting.Indented), Кодировка.UTF8, новый MediaTypeHeaderValue("application/json")); если (jsonString не равно нулю) { Client.DefaultRequestHeaders.Clear(); Client.DefaultRequestHeaders.Add("host", $"{ServerAddress}"); Client.DefaultRequestHeaders.Add("пользовательский агент", "python-requests/2.31.0"); Client.DefaultRequestHeaders.Add("accept-encoding", "gzip, deflate"); Client.DefaultRequestHeaders.Add("принять", "*/*"); Client.DefaultRequestHeaders.Add("соединение", "поддержание активности"); Client.DefaultRequestHeaders.TryAddWithoutValidation("тип содержимого", "application/json"); запрос var = новый System.Net.Http.HttpRequestMessage { Метод = System.Net.Http.HttpMethod.Get, RequestUri = новый Uri($"http://{ServerAddress}/poke_data"), Содержимое = jsonString, }; ответ вар = ждут Client.SendAsync(запрос).ConfigureAwait(false); ответ.EnsureSuccessStatusCode(); } еще { PokeLog += $"ECI-PokeOneShot:\tJson сериализация вернула значение null{Environment.NewLine}"; } } Поэтому я даже не уверен, что я вообще придерживаюсь правильного подхода, поскольку я видел, что существует много разных способов создания и использования конвертеров Json.

Любая помощь приветствуется!

Некоторые другие ресурсы, которые я изучил.

Игнорировать свойство с атрибутом в пользовательском конвертере JSON

Десериализовать Json в объект C# с помощью массива массивов
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»