Linq-To-JSON 查询以在分层 JSON 结构中查找特定属性的同级

Posted

技术标签:

【中文标题】Linq-To-JSON 查询以在分层 JSON 结构中查找特定属性的同级【英文标题】:Linq-To-JSON query to find the siblings of a particular property in a hierarchical JSON structure 【发布时间】:2017-03-10 23:29:49 【问题描述】:

鉴于以下 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。

观察下一个数据条目是一个 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,那么我只想要第一个。

谢谢。

【问题讨论】:

【参考方案1】:

我会这样做:

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

【讨论】:

一旦我看到它,它是有道理的。如此优雅。我承认我需要练习 JSON.NET 和 Linq,尽管每次你分享你的知识时我都会学到更多。高五,非常感谢。

以上是关于Linq-To-JSON 查询以在分层 JSON 结构中查找特定属性的同级的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 将数据表转换为分层数据结构 (JSON)

序列化对象以在 JavaScript/jQuery 中查询字符串 [重复]

PHP/MySQL - JSON 中的嵌套组

Swifty JSON:将 JSON 数组中的对象分层列表转换为分层 Swift 对象

Firestore分层设计 - 课程,学生

递归构建分层JSON树?