给定以下JSON:
{
"Data": {
"SPECIAL": "QQ01",
"AA": "QQ",
"BB": "QQ",
"Data": [
{
"SPECIAL": "QQ02",
"AA": "QQ",
"BB": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ03",
"AA": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ04",
"AA": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ05",
"AA": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ06",
"AA": "QQ",
"CC": "QQ"
}
]
},
{
"SPECIAL": "QQ07",
"AA": "QQ",
"CC": "QQ",
"DD": "QQ",
"Data": [
{
"SPECIAL": "QQ08",
"AA": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ09",
"AA": "QQ",
"BB": "QQ",
"CC": "QQ"
}
]
}
]
}
]
}
]
}
]
}
]
}
}我认为我理解JSON属性只是一个名称/值对,其中名称是一个字符串,值可以是一个字符串、一个JArray或一个JObject。如果我是正确的,上面的示例JSON将打开一个包含3个同级属性的数据JObject : SPECIAL、AA和BB。
注意,下一个数据输入是JArray。数组的第一个元素包含一个具有4个属性的对象: SPECIAL、AA、BB和CC。
问题:如何发出Linq查询以返回与QQ01相同的特殊的同级属性?返回值应该是一个JProperty列表,其中只包含:SpecialQ01、AA:QQ和BB:QQ。注意,这些属性位于JObject中。
如果我希望特殊的4个同级属性与QQ02相等,同样的查询将需要工作。在这种情况下,返回值将是只包含: JProperty :QQ 02、AA:QQ、BB:QQ和CC:QQ的列表。请注意,这些属性位于位于JObject中的JArray中。
哦,如果有多个条目特别等于QQ01,或者,在第二种情况下,特别等于QQ02--那么我只想要第一个条目。
谢谢。
发布于 2016-10-28 06:25:15
我会这样做:
JObject jo = JObject.Parse(json);
var props = jo.Descendants()
.OfType<JProperty>()
.Where(p => p.Name == "SPECIAL" && (string)p.Value == "QQ01")
.Take(1)
.Select(p => p.Parent)
.SelectMany(o => o.Children<JProperty>())
.Where(p => p.Value.Type == JTokenType.String)
.ToList();
foreach (JProperty prop in props)
{
Console.WriteLine(prop.Name + ": " + prop.Value);
}https://stackoverflow.com/questions/40298859
复制相似问题