Linq-To-JSON查询以在分层JSON结构中查找特定属性的兄弟节点

时间:2016-10-28 05:53:16

标签: 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",
            "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 个答案:

答案 0 :(得分:6)

这是我将如何做到的:

Already up-to-date

小提琴:https://dotnetfiddle.net/nvIXkO