Навигация или преобразование JSON с помощью Linq

Рассмотрим этот JSON

{
  "data": "014",
  "theme": "COLORADO CASUAL",
  "family": "2163",
  "category": "00",
  "compo_groups": [
    {
      "title": "HEAD024",
      "values": [
        {
          "perc": "100",
          "desc": "COMP036"
        }
      ]
    },
    {
      "title": "HEAD035",
      "values": [
        {
          "perc": "100",
          "desc": "COMP042"
        },
        {
          "perc": "50",
          "desc": "COMP043"
        }
      ]
    }
  ],
  "product_name": "D812",
  "supplier_code": "1011"
}

Мне нужно проверить, что все мои композиции ровно 100шт. В этом JSON у меня есть 2 группы композиции. Первый правильный. У меня один элемент на 100шт. Второй состоит из 2 элементов и всего 150 шт. Это ошибка.

Мне нужно написать код на C#, который обнаруживает ошибку. Я могу написать большую часть этого кода. Я просто не знаю, как преобразовать этот JSON в список значений, которыми я могу управлять с помощью LinQ.

Вы пытались анализировать json в классах и обрабатывать их?

Guru Stron 14.02.2023 13:05

Также какую библиотеку json вы используете?

Guru Stron 14.02.2023 13:05

Что ты уже испробовал? Где ты застрял?

Peter Csala 14.02.2023 13:44

Извините, у меня не было времени правильно доработать вопрос. Сейчас я использую System.Text.Json. Я привык к Newtonsoft, но Microsoft кажется таким же. Я добавлю сюда то, что уже пробовал.

Bastien Vandamme 15.02.2023 02:25

Я использую System.Text.Json.Nodes.JsonObject и System.Text.Json.Nodes.JsonNode. Я десериализую с помощью System.Text.Json.JsonSerializer.Deserialize<T>.

Bastien Vandamme 15.02.2023 02:30
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
0
5
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужны никакие классы для получения нужных данных

using System.Text.Json;

List<string> titles = JsonNode.Parse(json)["compo_groups"].AsArray()
                         .Select(x => x["values"].AsArray())
                         .Where(v => v.Select(x => 
                          Convert.ToInt32(x["perc"].GetValue<string>())).Sum() > 100)
                         .Select(v => v.Parent["title"].GetValue<string>())
                         .ToList();  // result  ["HEAD035"]

Или

using Newtonsoft.Json;

List<string> titles = JObject.Parse(json)["compo_groups"]
    .Select(x => x["values"])
    .Where(v => v.Select(x => (int)x["perc"]).Sum() > 100)
    .Select(v => v.Parent.Parent)
    .Select(p=> (string) p["title"]) // here you can select any data you need
    .ToList();  // result  ["HEAD035"]

Вы используете Parse(), а затем AsArray(). Это похоже на то, что я сделал с JsonNode. Я все время получаю исключение для AsArray(). Попробую еще раз разобраться, что я сделал не так. Спасибо за помощь.

Bastien Vandamme 15.02.2023 04:49
Ответ принят как подходящий

Предполагая, что вы используете последнюю версию .NET (например, .NET6), вы можете использовать встроенные библиотеки System.Text.Json для анализа ввода JSON. Если вам нужно использовать другие части JSON, я бы рекомендовал десериализовать в конкретные классы C#, чтобы вы получили надлежащую проверку, IntelliSense и все такое хорошее.

Однако, если вы просто хотите проверить эти проценты, вы можете напрямую использовать библиотеку STJ, например, что-то вроде этого:

// Load JSON 
var json = "{...}";
var doc = JsonDocument.Parse(json);

// Manually walk the document to get the values you need and summarise
var result = doc.RootElement
    .GetProperty("compo_groups")
    .EnumerateArray()
    .Select(a => new 
    {
        Title = a.GetProperty("title").ToString(),
        Percentage = a.GetProperty("values")
            .EnumerateArray()
            .Select(v => double.Parse(v.GetProperty("perc").ToString()))
            .Sum()
    });

И вы можете перебрать этот результат следующим образом:

foreach(var value in result)
{
    Console.WriteLine($"Title '{value.Title}' has a percentage of {value.Percentage}");
}

Что выведет это:

Title 'HEAD024' has a percentage of 100
Title 'HEAD035' has a percentage of 150

Главное использовать System.Text.Json.JsonDocument

Bastien Vandamme 15.02.2023 02:41

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