簡體   English   中英

用 C# 中的 Json.NET 計算 JSON 字符串中的元素數

[英]Count Number of Elements in JSON string with Json.NET in C#

我有一個 JSON 字符串,如下所示:

{
"package1": {
    "type": "envelope",
    "quantity": 1,
    "length": 6,
    "width": 1,
    "height": 4
},
"package2": {
    "type": "box",
    "quantity": 2,
    "length": 9,
    "width": 9,
    "height": 9
}
}

我正在使用 Json.NET LINQ 到 JSON 功能來處理我的 JSON 字符串,但我想知道如何在我的字符串中找到節點/元素/鍵的總數(我不確定如何稱呼它們)。 例如,上面的字符串有 package1 和 package2,所以我想知道如何讓它返回 integer 2。有時我可能只有一個 package,在這種情況下,我希望它返回 integer 1。其他有時我可能有 20 個包裹(在那種情況下我希望它返回 20 個)。

我的 JObject 看起來像這樣:

JObject o = JObject.Parse(myJsonString);

有任何想法嗎? 謝謝你的幫助。

JObject jObj = (JObject)JsonConvert.DeserializeObject(myJsonString);
int count = jObj.Count;

獎金:

dynamic jObj = JsonConvert.DeserializeObject(myJsonString);

foreach (var package in jObj)
{
    Console.WriteLine("{0} {1}", package.First.type, package.First.quantity);
}

遞歸版本(計算所有具有原始值的屬性)

遇到這個問題試圖用谷歌搜索 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# object 上有多少非默認值,而 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會保留作為 arrays 一部分的默認值,因此如果您想要該功能,則需要以不同的方式或其他方式計算數組項,此活動留給讀者

https://do.netfiddle.net/XIZCvh

使用Cinchoo ETL - 一個開源庫,您可以輕松地進行節點計數,開銷更少 memory,因為它使用流式方法來解析輸入。 因此它也可以處理大文件。

string json = @"{
""package1"": {
""type"": ""envelope"",
""quantity"": 1,
""length"": 6,
""width"": 1,
""height"": 4
},
""package2"": {
""type"": ""box"",
""quantity"": 2,
""length"": 9,
""width"": 9,
""height"": 9
}
}";

using (var p = ChoJSONReader.LoadText(json).WithJSONPath("$.*"))
{
    Console.WriteLine(p.Count());
}

希望能幫助到你。

 string json= "{
"package1": {
"type": "envelope",
"quantity": 1,
"length": 6,
"width": 1,
"height": 4
 },
 "package2": {
 "type": "box",
 "quantity": 2,
 "length": 9,
 "width": 9,
 "height": 9
 }
 }"; 

 dynamic stuff;
 int count;
 stuff = JsonConvert.DeserializeObject(json);
 foreach(JProperty s in stuff){

  count++;
  }

  Console.WriteLine(count.ToString());

如果 Count 屬性不適合你,試試這個。 確保您的 C# 版本為 4.0 或更高版本,因為當時添加了動態關鍵字。

字典類型使用反序列化:

JsonConvert.DeserializeObject<IDictionary>(myJsonString).Count

要么

JsonConvert.DeserializeObject<IDictionary<string, object>>(myJsonString).Count

在 JQuery $.ajax 你會收到一個數組,遍歷元素並得到總和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM