给定以下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个兄弟属性的Data JObject: SPECIAL、AA和BB。
观察下一个Data条目是一个JArray。数组的第一个元素包含一个对象,它有4个属性:SPECIAL, AA, BB和CC。
问题:我如何发出一个Linq查询来返回等于QQ01的SPECIAL的兄弟属性?返回值应该是一个JProperty列表,只包含:SPECIAL:QQ01, AA:QQ, BB:QQ。注意,这些属性都在一个JObject中。
如果我想让SPECIAL的4个兄弟属性等于QQ02,那么同样的查询需要工作。在这种情况下,返回值将是一个JProperty列表,其中只包含:SPECIAL:QQ02, AA:QQ, BB:QQ和CC:QQ。请注意,这些属性位于JArray中的JObject中。
哦,如果有不止一个条目的SPECIAL等于QQ01,或者在第二种情况下,SPECIAL等于QQ02——那么我只需要第一个条目。
谢谢。
我是这样做的:
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://dotnetfiddle.net/nvIXkO