Вы всегда можете просто посчитать свойства JObject
, используя JContainer.Count
.Вам нужны объекты с одним свойством с именем "Name"
:
foreach (var category in jObject["Categories"].OfType<JObject>())
{
var result = category.Count == 1 && category.Property("Name") != null;
}
Тот факт, что вы используете dynamic
, затрудняет доступ к свойствам c # вашей категории JObject
, посколькутакже может быть свойством JSON с именем "Count"
.Я бы предложил вместо этого перейти к явно типизированным объектам и методам.Это также даст вам проверку ошибок во время компиляции и, возможно, улучшенную производительность, как объяснено в Как влияет динамическая переменная на производительность? .
Примерfiddle здесь .
Обновление
Если я пойду на решение Except(...).Any()
, что мне нужно будет поставить в скобках?
Согласно документации , Enumerable.Except
Создает разность установок двух последовательностей.
Таким образом, вы можете попробовать что-то вроде:
var result = !category.Properties()
.Select(p => p.Name)
.Except(new [] { "Name" })
.Any();
Однако есть проблема с этим подходом: использование Except()
не соответствует вашему заявленному требованию, что вам нужно
... определить для каждой категории, состоит ли она только из клавиши Name
.
Except(...).Any()
проверит наличие дополнительных клавишкроме Name
, но он не будет проверять наличие самого ключа Name
, так как он будет отфильтрован,Таким образом, пустой объект JSON {}
будет ошибочно принят.
Вместо этого вам нужно будет проверить равенство последовательностей, например, так:
foreach (var category in jObject["Categories"].OfType<JObject>())
{
var result = category.Properties()
.Select(p => p.Name)
.SequenceEqual(new [] { "Name" });
}
И если вам требуется присутствиеиз нескольких ключей, так как объект JSON представляет собой неупорядоченный набор пар имя / значение в соответствии со стандартом , вы можете отсортировать их по требованию равенства неупорядоченных последовательностей:
var requiredKeys = new [] { "Name" } // Add additional required keys here
.OrderBy(n => n, StringComparer.Ordinal).ToArray();
foreach (var category in jObject["Categories"].OfType<JObject>())
{
var result = category.Properties()
.Select(p => p.Name)
.OrderBy(n => n, StringComparer.Ordinal)
.SequenceEqual(requiredKeys);
}
Или, если хотите, вы можете использовать requiredKeys.ToHashSet(StringComparer.Ordinal)
, а затем SetEquals()
.
Но, на мой взгляд, если вам просто нужно проверитьНезависимо от того, состоит ли объект JSON только из одного указанного ключа, исходное решение является самым простым и наиболее декларативным.
Демо-скрипта # 2 здесь .