C# 使用C中的JSON.NET计算JSON字符串中的元素数#

C# 使用C中的JSON.NET计算JSON字符串中的元素数#,c#,json,json.net,C#,Json,Json.net,我有一个JSON字符串,如下所示: { "package1": { "type": "envelope", "quantity": 1, "length": 6, "width": 1, "height": 4 }, "package2": { "type": "box", "quantity": 2, "length": 9, "width": 9, "height": 9 } } JObject o = JOb

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

{
"package1": {
    "type": "envelope",
    "quantity": 1,
    "length": 6,
    "width": 1,
    "height": 4
},
"package2": {
    "type": "box",
    "quantity": 2,
    "length": 9,
    "width": 9,
    "height": 9
}
}
JObject o = JObject.Parse(myJsonString);
我正在使用Json.NET LINQ to Json功能来处理我的Json字符串,但我想知道如何在我的字符串中找到节点/元素/键的总数(我不确定如何称呼它们)。例如,上面的字符串有package1和package2,所以我想知道如何让它返回整数2。有时我可能只有一个包,在这种情况下,我希望它返回整数1。其他时候,我可能有20个包(在这种情况下,我希望它返回20个)

我的作业对象如下所示:

{
"package1": {
    "type": "envelope",
    "quantity": 1,
    "length": 6,
    "width": 1,
    "height": 4
},
"package2": {
    "type": "box",
    "quantity": 2,
    "length": 9,
    "width": 9,
    "height": 9
}
}
JObject o = JObject.Parse(myJsonString);

有什么想法吗?感谢您的帮助。

在JQuery$.ajax中,您将收到一个数组,遍历元素并获得总和

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;
}
请注意,
DefaultValueHandling.Ignore
保留作为数组一部分的默认值,因此如果需要该功能,您需要以不同的方式或其他方式计算数组项,此活动将留给读者

有了一个开源库,您可以用更少的内存开销轻松地进行节点计数,因为它使用流方法来解析输入。因此,它也可以处理大文件

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或更高版本,因为当时添加了dynamic关键字。

非常感谢您的回复,但我正在尝试找出如何使用C#中的Json.NET实现这一点。非常感谢!这几天来一直让我发疯。我将在4分钟内将其标记为正确:)@BrentBarbata:)哈,在阅读建议的24-48小时等待时间之前,我接受了它。我是新来的,所以我还在学习。无论如何,再次感谢您的帮助。@BrentBarbata如果您能使用
dynamic
第二种方法,您将看到好处。第二种方法对我最终尝试的工作更有效。万分感谢!