我想计算一个对象内的属性数量。我找到了几种解决方案,但没有一个真正计算子\嵌套属性。
例如,我有以下 JSON 对象。
{
"id": "259a36d2-3852-425f-a70c-3f9477753210",
"name": "foo",
"type": "na",
"text": "ABC.pdf",
"left": 333,
"top": 130,
"w": 134,
"h": 34,
"customData": {
"A": "fa6css4ec8-8ffb-55bca4dde06a",
"name": "SDF.pdf",
"IsExists": false,
"PNumber": 1,
}
}
Run Code Online (Sandbox Code Playgroud)
当尝试以下操作时,我得到的结果是 9,而我期望的是 12(这是整个属性的计数)。
JObject sourceJObject = JsonConvert.DeserializeObject<JObject>(json);
var res= sourceJObject.Count;
Run Code Online (Sandbox Code Playgroud)
当助理我会很高兴。
JObject.Count被记录为返回子令牌的计数- 不是所有后代令牌。因此,虽然您可能想要12 个,但您不应该真正期望12 个。
如果您想要所有后代的计数,可以使用sourceJObject.Descendants().Count()。然而,这会给你 13 而不是 12,因为customData它本身就是一个令牌。
如果您想要“值不是对象的所有后代属性”,您可以使用OfTypeand Where,如下面的代码所示。不过,您可能应该考虑一下您想对数组做什么......
using Newtonsoft.Json.Linq;
string json = File.ReadAllText("test.json");
JObject jobject = JObject.Parse(json);
var properties = jobject.Descendants()
.OfType<JProperty>()
.Where(prop => prop.Value is not JObject);
Console.WriteLine($"Count: {properties.Count()}");
foreach (var property in properties)
{
Console.WriteLine($"{property.Name} = {property.Value}");
}
Run Code Online (Sandbox Code Playgroud)
输出:
Count: 12
id = 259a36d2-3852-425f-a70c-3f9477753210
name = foo
type = na
text = ABC.pdf
left = 333
top = 130
w = 134
h = 34
A = fa6css4ec8-8ffb-55bca4dde06a
name = SDF.pdf
IsExists = False
PNumber = 1
Run Code Online (Sandbox Code Playgroud)