我想計算一個物件中的屬性數量。我找到了幾種解決方案,但沒有一個真正計算子\嵌套屬性。
例如,我有以下 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,
}
}
在嘗試以下操作時,我得到了 9 的結果,而我期待 12(這是整個屬性的計數)。
JObject sourceJObject = JsonConvert.DeserializeObject<JObject>(json);
var res= sourceJObject.Count;
我會為助理感到高興。
uj5u.com熱心網友回復:
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}");
}
輸出:
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
uj5u.com熱心網友回復:
嘗試這個
var obj=JObject.Parse(json);
var count=0;
CountProps(obj, ref count); // count=12
public void CountProps(JToken obj, ref int count)
{
if (obj is JObject)
foreach (var property in ((JObject)obj).Properties())
{
if (property.Value is JValue) count ;
if (property.Value is JObject) CountProps(property.Value, ref count);
if (property.Value is JArray) { count ; CountProps(property.Value, ref count); }
}
if (obj.GetType().Name == "JArray")
foreach (var property in ((JArray)obj))
if (property is JObject || property is JArray) CountProps(property, ref count);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435534.html
