Если вы используете Json.NET, вы можете загрузить JSON с помощью LINQ to JSON, а затем использовать SelectTokens
рекурсивно найти все "fruits"
свойства, а затем рекурсивно собрать все значения потомков строки (тот типа JValue
), сгруппировать их по их строковому значению, и положить их в порядке убывания:
var token = JToken.Parse(jsonString);
var fruits = token.SelectTokens("..fruits") // Recursively find all "fruit" properties
.SelectMany(f => f.DescendantsAndSelf()) // Recursively find all string literals undernearh each
.OfType<JValue>()
.GroupBy(f => (string)f) // Group by string value
.OrderByDescending(g => g.Count()) // Descending order by count.
.ToList();
Или, если вы предпочитаете ставить свои результаты в анонимный тип для ясности:
var fruits = token.SelectTokens("..fruits") // Recursively find all "fruit" properties
.SelectMany(f => f.DescendantsAndSelf()) // Recursively find all string literals undernearh each
.OfType<JValue>()
.GroupBy(f => (string)f) // Group by string value
.Select(g => new { Fruit = (string)g.Key, Count = g.Count() })
.OrderByDescending(f => f.Count) // Descending order by count.
.ToList();
Тогда потом:
Console.WriteLine(JsonConvert.SerializeObject(fruits, Formatting.Indented));
Производит:
[
{
"Fruit": "apple",
"Count": 2
},
{
"Fruit": "banana",
"Count": 1
},
{
"Fruit": "orange",
"Count": 1
}
]
** Обновление **
Забыла включить следующий метод расширения
public static class JsonExtensions
{
public static IEnumerable<JToken> DescendantsAndSelf(this JToken node)
{
if (node == null)
return Enumerable.Empty<JToken>();
var container = node as JContainer;
if (container != null)
return container.DescendantsAndSelf();
else
return new [] { node };
}
}
оригинальный вопрос был немного расплывчатым о точном структура JSON, поэтому я предложил использовать Linq, а не десериализацию.
Этот JSON недействителен, согласно http://jsonlint.com/. Не могли бы вы обновить свой вопрос с помощью действительного JSON? – dbc
в порядке выше json сейчас. – Euridice01
@CodeCaster, я бы десериализовал с помощью XmlSerializer и, например, поставил вышеприведенный список. Итак, допустим, у меня есть список – Euridice01