Достать значения по ключу в JSON C# (Newtonsoft.Json) [дубликат]

127
12 января 2021, 03:40
На этот вопрос уже дан ответ здесь:
Как распарсить объект такого вида на c#? (1 ответ)
Закрыт 1 год назад.

Всем привет! Есть такой вот JSON -

{
  "result": [
    {
      "banner_image_light": "",
      "country": "",
      "parent": "",
      "u_glide_date_2": "",
      "notes": "",
      "u_group": "",
      "stock_symbol": "",
      "discount": "",
      "sys_updated_on": "",
      "u_manager": {
        "link": "",
        "value": ""
      },
      "apple_icon": "",
      "u_client_type": "",
      "sys_updated_by": "",
      "fiscal_year": "",
      "sys_created_on": "",
      "contact": "",
      "stock_price": "",
      "banner_image": "",
      "state": "",
      "u_short_name": "",
    }
  ]
}

Получаю JSON через RestSharp, используя REST API, и заношу в переменную типа String. В массиве "result" значений может быть много. Мне необходимо достать значения по ключу "u_short_name" и занести в массив, для последующего использования в Combobox. Как это реализовать?

Answer 1

Подключаем из nuget библиотеку Json.NET.

Открываем пространство имён:

using Newtonsoft.Json.Linq;

Пишем:

var text = File.ReadAllText("test.json");
var json = JObject.Parse(text);
var shortNames = json["result"]
    .Select(token => token["u_short_name"].Value<string>())
    .ToArray();
comboBox.DataSource = shortNames;

Этот способ не требует создания моделей классов. Иногда он удобен, благодаря простоте. В других случаях лучше будет создать классы.

Answer 2

Пример с использованием моделей:
Создаем 3 модели:

public class Result
{
    [JsonProperty("result")]
    public ResultElement[] ResultResult { get; set; }
}
public class ResultElement
{
    [JsonProperty("banner_image_light")]
    public string BannerImageLight { get; set; }
    [JsonProperty("country")]
    public string Country { get; set; }
    [JsonProperty("parent")]
    public string Parent { get; set; }
    [JsonProperty("u_glide_date_2")]
    public string UGlideDate2 { get; set; }
    [JsonProperty("notes")]
    public string Notes { get; set; }
    [JsonProperty("u_group")]
    public string UGroup { get; set; }
    [JsonProperty("stock_symbol")]
    public string StockSymbol { get; set; }
    [JsonProperty("discount")]
    public string Discount { get; set; }
    [JsonProperty("sys_updated_on")]
    public string SysUpdatedOn { get; set; }
    [JsonProperty("u_manager")]
    public UManager UManager { get; set; }
    [JsonProperty("apple_icon")]
    public string AppleIcon { get; set; }
    [JsonProperty("u_client_type")]
    public string UClientType { get; set; }
    [JsonProperty("sys_updated_by")]
    public string SysUpdatedBy { get; set; }
    [JsonProperty("fiscal_year")]
    public string FiscalYear { get; set; }
    [JsonProperty("sys_created_on")]
    public string SysCreatedOn { get; set; }
    [JsonProperty("contact")]
    public string Contact { get; set; }
    [JsonProperty("stock_price")]
    public string StockPrice { get; set; }
    [JsonProperty("banner_image")]
    public string BannerImage { get; set; }
    [JsonProperty("state")]
    public string State { get; set; }
    [JsonProperty("u_short_name")]
    public string UShortName { get; set; }
}
public class UManager
{
    [JsonProperty("link")]
    public string Link { get; set; }
    [JsonProperty("value")]
    public string Value { get; set; }
}

В итоге код сводится к следующему:

var rawJson = File.ReadAllText("test.json");
Result result = JsonConvert.DeserializeObject<Result>(rawJson);
var shortNames = result.ResultResult.Select(x => x.UShortName);
comboBox.DataSource = shortNames;

Так же как и вариант от Alexander Petrov, мой вариант решения имеет как плюсы, так и минусы.
(p.s. - модели все созданы через https://app.quicktype.io/, удобный вариант для создания моделей)

READ ALSO
Заполнение БД через приложение WPF

Заполнение БД через приложение WPF

Пишу приложение на WPF, которое взаимодействует с БД MySQLВнутри TabItem есть DataGrid, который выводит данные из БД:

124
WPF Реализация условий, соблюдая паттерн MVVM

WPF Реализация условий, соблюдая паттерн MVVM

Подскажите как реализовать в WPF приложении условияНапример, я хочу, чтобы в зависимости от текста одного TextBlock'a изменялся цвет текста другого...

118
Получение информации о мониторах без WinForms

Получение информации о мониторах без WinForms

Необходимо получать данные о количестве мониторов, а так-же о рабочей области каждого из них, иметь возможность получить вычислить монитор,...

110