Jaz*_*mov 4 c# linq json json.net
给出以下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"
}
]
}
]
}
]
}
]
}
]
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我以为我知道JSON属性只是一个名称/值对,其中名称是一个字符串,值可以是字符串,JArray或JObject.如果我是正确的,上面的示例JSON将打开一个包含3个兄弟属性的Data JObject:SPECIAL,AA和BB.
观察下一个数据条目是JArray.数组的第一个元素包含一个具有4个属性的对象:SPECIAL,AA,BB和CC.
问题: 如何发出Linq查询以返回SPECIAL的兄弟属性等于QQ01?返回值应该是仅包含的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);
}
Run Code Online (Sandbox Code Playgroud)
小提琴:https://dotnetfiddle.net/nvIXkO
| 归档时间: |
|
| 查看次数: |
566 次 |
| 最近记录: |