我有一个如下所示的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 to JSON功能来处理我的JSON字符串,但我想知道如何找到节点/元素/键的总数(我真的不知道该怎么称呼它们)在我的字符串中。例如,上面的字符串有package1和package2所以我想知道如何让它返回整数2.有时我可能只有一个包,在这种情况下,我希望它返回整数1.其他我可能有20个包(在这种情况下,我希望它能返回20个)。
我的JObject看起来像这样:
JObject o = JObject.Parse(myJsonString);
有什么想法吗?谢谢你的帮助。
答案 0 :(得分:20)
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);
}
答案 1 :(得分:0)
遇到这个问题,试图用Google递归计数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
保留默认值是数组的一部分,因此,如果您想要该功能,则需要以其他方式或其他方式对数组项进行计数,该活动留给读者 >
答案 2 :(得分:0)
答案 3 :(得分:0)
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关键字。
答案 4 :(得分:-3)
在JQuery $ .ajax中,您将收到一个数组,遍历元素并得到总和。