递归版本(计算所有具有原始值的属性)
遇到这个问题试图用谷歌搜索 JObject 值的递归计数,没有找到很多其他问题,所以我想我也会将我想出的内容添加到这个问题中
int CountJTokenProperties(JToken token)
{
var sum = 0;
if (token.Type == JTokenType.Object)
{
foreach (var child in token.Value<JObject>())
{
sum += CountJTokenProperties(child.Value);
}
}
else if (token.Type == JTokenType.Array)
{
foreach (var child in token.Value<JArray>())
{
sum += CountJTokenProperties(child);
}
}
else
{
sum += 1;
}
return sum;
}
和可能有更好的选择.Value<JObject>()
,.Value<JArray>()
但这似乎有效。
特别是我想要一个具有可变样本数据的 nunit 测试,并希望确保它正确反序列化。决定一个简单的检查方法是 C# 对象上有多少非默认值,并且 JsonConvert 具有这种能力:
public int CountNonDefaultProperties(object obj)
{
// Let JsonConvert do the work of stripping out default values
var serialized = JsonConvert.SerializeObject(obj, new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Ignore
});
// Recurse into the json structure, which is much simpler than C# Object structure
var jObj = JObject.Parse(serialized);
return CountJTokenProperties(jObj);
}
请注意,DefaultValueHandling.Ignore
保留作为数组一部分的默认值,因此如果您想要该功能,您需要以不同的方式或其他方式计算数组项,此活动留给读者
https://dotnetfiddle.net/XIZCvh