Рассмотрим этот 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 вы используете?
Что ты уже испробовал? Где ты застрял?
Извините, у меня не было времени правильно доработать вопрос. Сейчас я использую System.Text.Json. Я привык к Newtonsoft, но Microsoft кажется таким же. Я добавлю сюда то, что уже пробовал.
Я использую System.Text.Json.Nodes.JsonObject и System.Text.Json.Nodes.JsonNode. Я десериализую с помощью System.Text.Json.JsonSerializer.Deserialize<T>.
Вам не нужны никакие классы для получения нужных данных
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(). Попробую еще раз разобраться, что я сделал не так. Спасибо за помощь.
Предполагая, что вы используете последнюю версию .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
Вы пытались анализировать json в классах и обрабатывать их?