C# Linq To JSON查询以查找分层JSON结构中特定属性的同级
给定以下JSON:C# Linq To JSON查询以查找分层JSON结构中特定属性的同级,c#,json,linq,json.net,C#,Json,Linq,Json.net,给定以下JSON: { "Data": { "SPECIAL": "QQ01", "AA": "QQ", "BB": "QQ", "Data": [ { "SPECIAL": "QQ02", "AA": "QQ", "BB": "QQ", "CC": "QQ", "Data": [ { "SPECIAL": "QQ03",
{
"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列表:SPECIAL:QQ01、AA:QQ和BB:QQ。请注意,这些属性位于JObject中
如果我希望特殊类型的4个同级属性等于QQ02,则需要使用相同的查询。在这种情况下,返回值将是仅包含以下内容的JProperty列表:SPECIAL:QQ02、AA:QQ、BB:QQ和CC:QQ。请注意,这些属性位于JArray中的JObject中
哦,如果有多个条目的特殊值等于QQ01,或者在第二种情况下,特殊值等于Q02,那么我只想要第一个
谢谢。以下是我的做法:
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);
}
JObject jo=JObject.Parse(json);
var props=jo.subjects()
第()类
其中(p=>p.Name==“特殊”&&(字符串)p.Value==“QQ01”)
.采取(1)
.Select(p=>p.Parent)
.SelectMany(o=>o.Children())
.Where(p=>p.Value.Type==JTokenType.String)
.ToList();
foreach(道具中的JProperty道具)
{
Console.WriteLine(prop.Name+“:”+prop.Value);
}
小提琴:一旦我看到它,它就有意义了。太优雅了。我承认我需要练习JSON.NET和Linq,尽管每次你分享你的知识时我都会学到更多。击掌致谢。