Не могли бы вы рассказать, как использовать ответ 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, но до сих пор не могу найти, что это работает у меня.
Огромное спасибо, ребята, за ваше время.
Десериализация в StreamReader (JsonConvert.DeserializeObject<StreamReader>()) не имеет никакого смысла. Вы должны выполнить десериализацию в объект. Насколько вы знакомы с использованием JSON.Net?





Десериализация означает анализ 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}");
}
Я призываю вас использовать более описательные имена классов, чем те, которые я показал здесь.
Окно сообщения не имеет значения. Он просто отобразит все, что вы ему передадите. Ваша актуальная проблема — проанализировать JSON, а затем отформатировать данные так, как вы хотите. Как и в случае с любой проблемой программирования, первым шагом является размышление о связанной с ней логике. Код, который у вас есть, пытается получить одно значение
stringи одно значениеstring. Как это соответствует любой логике, применимой к чтению данных, содержащих элементName, а затем несколько парAmountиvaluesвнутри него? Если вы не можете описать логику, которую необходимо реализовать, вам не следует даже думать о коде.