Окно сообщения C#, десериализация ответа JSON из запроса HTTP POST

Не могли бы вы рассказать, как использовать ответ JSON на HTTP-запрос POST в окне сообщения?

Я просто хочу, чтобы 2 значения из JSON отображались в моем окне сообщения или, что еще лучше, если отображение может быть в таблице/сетке данных.

Я хочу сделать это в окне сообщений следующим образом:

Brad  :  100
Maria :  50
Dina  :  25

или

| Brad  |  100  |
| Maria |   50  |
| Dina  |   25  |

Вот JSON, который я получаю в результате HTTP-запроса:

{
  "values": [
    {
      "Name": "Brad",
      "Amount": "100"
    },
    {
      "Name": "Maria",
      "Amount": "50"
    },
    {
      "Name": "Dina",
      "Amount": "25"
    }
  ],
  "response": 200
}

И вот мой код С#:

using (WebResponse response = request.GetResponse())
{
    using (Stream stream = response.GetResponseStream())
    {
        using (StreamReader sr99 = new StreamReader(stream))
        {
            responseContent = sr99.ReadToEnd();

            JsonConvert.DeserializeObject<StreamReader>(responseContent);
            JObject json = JObject.Parse(responseContent);

            string nameValue = (string)json["Name"];
            string amountValue = (string)json["Amount"];

            MessageBox.Show(nameValue + " : " + amountValue);
        }
    }
}

Я пробовал все, что нашел в Stackoverflow/Google, но до сих пор не могу найти, что это работает у меня.

Огромное спасибо, ребята, за ваше время.

Окно сообщения не имеет значения. Он просто отобразит все, что вы ему передадите. Ваша актуальная проблема — проанализировать JSON, а затем отформатировать данные так, как вы хотите. Как и в случае с любой проблемой программирования, первым шагом является размышление о связанной с ней логике. Код, который у вас есть, пытается получить одно значение string и одно значение string. Как это соответствует любой логике, применимой к чтению данных, содержащих элемент Name, а затем несколько пар Amount и values внутри него? Если вы не можете описать логику, которую необходимо реализовать, вам не следует даже думать о коде.

jmcilhinney 10.10.2023 02:44

Десериализация в StreamReader (JsonConvert.DeserializeObject<StreamReader>()) не имеет никакого смысла. Вы должны выполнить десериализацию в объект. Насколько вы знакомы с использованием JSON.Net?

gunr2171 10.10.2023 02:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Десериализация означает анализ json с экземпляром объекта (на самом деле классом модели), включая те же структуры (свойства). поэтому метод JsonConvert.DeserializeObject<MyClass>(stream) должен быть модельным классом T

Ответ принят как подходящий

Вы используете два разных метода анализа JSON с использованием библиотеки JSON.Net: JsonConvert.DeserializeObject и JObject.Parse. Не используйте оба одновременно.

Вариант 1. Исправление кода JObject.Parse.

После синтаксического анализа JSON в объект (JObject.Parse в json), вам необходимо углубиться в свойство values. Для каждого объекта в этом массиве вы можете получить свойства «Имя» и «Сумма».

var responseContent = "{\"values\":[{\"Name\":\"Brad\",\"Amount\":\"100\"},{\"Name\":\"Maria\",\"Amount\":\"50\"},{\"Name\":\"Dina\",\"Amount\":\"25\"}],\"response\":200}";

JObject json = JObject.Parse(responseContent);
foreach (JObject value in json["values"])
{
    // make sure to index "value" not "json", as we want to access
    // each object in the values array, not the root of the JSON object.
    string name = value["Name"].Value<string>();
    string amount = value["Amount"].Value<string>();
    Console.WriteLine($"{name} : {amount}");
}

Если вы используете ссылочные типы, допускающие значение NULL (и вам следует это сделать), вы получите сумасшедшее количество предупреждений, поэтому будьте осторожны.

Вариант 2 — Правильное использование JsonConvert.DeserializeObject.

Чтобы использовать JsonConvert.DeserializeObject, вам нужно создать свой собственный тип, который правильно моделирует данные, которые вы будете получать. Используйте этот тип в качестве общего аргумента.

public class MyResponse
{
    [JsonProperty("response")]
    public int Response { get; set; }

    [JsonProperty("values")]
    public List<Value> Values { get; set; }
}

public class Value
{
    public string Name { get; set; }
    public int Amount { get; set; }
}
var data = JsonConvert.DeserializeObject<MyResponse>(responseContent);
foreach(var value in data.Values)
{
    Console.WriteLine($"{value.Name} : {value.Amount}");
}

Я призываю вас использовать более описательные имена классов, чем те, которые я показал здесь.

Другие вопросы по теме