JsonPath-提取满足多个条件的对象?

JsonPath-提取满足多个条件的对象?,json,jsonpath,nested-object,Json,Jsonpath,Nested Object,在下面给出的Json字符串中,我想找到category=m且“middle”数组包含符合此条件的元素的所有元素——元素的“middle”数组具有itemType=Executable的对象 我想使用jsonpath来获得所需的对象。我不喜欢使用jmespath,因为它对于我来说太复杂了。但是,我不熟悉jsonpath,我无法从在线教程中理解json查询,这些教程太琐碎或太基本。我想知道使用编程语言来获取我需要的数据是否更好。请告知 到目前为止,我只能通过使用这个jsonpath查询来提取cate

在下面给出的Json字符串中,我想找到category=m且“middle”数组包含符合此条件的元素的所有元素——元素的“middle”数组具有itemType=Executable的对象

我想使用jsonpath来获得所需的对象。我不喜欢使用jmespath,因为它对于我来说太复杂了。但是,我不熟悉jsonpath,我无法从在线教程中理解json查询,这些教程太琐碎或太基本。我想知道使用编程语言来获取我需要的数据是否更好。请告知

到目前为止,我只能通过使用这个jsonpath查询来提取category=m的元素
$.[?(@.category==“m”)]
。剩下的部分我怎么做

Json: 概述-每个对象都有一个“内容”对象。除其他字段外,每个内容对象通常都有一个开始、中间和结束数组。中间数组可以包含多个内容对象,以此类推。某些内容对象只有一个中间数组。我对在上面提到的内容对象中查找项目感兴趣

请注意,这不是我必须处理的实际json。这是一种经过消毒的仿制品

{
  "id": "123",
  "contents": {
    "title": "B1",
    "start": [],
    "middle": [
      {
        "level": "1",
        "contents": {
          "title": "C1",
          "category": "c",
          "start": [],
          "middle": [
            {
              "level": "2",
              "contents": {
                "title": "M1",
                "category": "m",
                "start": [],
                "middle": [
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT1",
                      "middle": [
                        {
                          "itemType": "Data"
                        }
                      ]
                    }
                  },
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT2",
                      "middle": [
                        {
                          "itemType": "Executable",
                          "id": "exec1"
                        }
                      ]
                    }
                  },
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT3",
                      "middle": [
                        {
                          "itemType": "Data"
                        }
                      ]
                    }
                  }
                ],
                "end": []
              }
            },
            {
              "level": "2",
              "contents": {
                "title": "M2",
                "category": "m",
                "start": [],
                "middle": [
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT1",
                      "middle": [
                        {
                          "itemType": "Data"
                        }
                      ]
                    }
                  },
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT2",
                      "middle": [
                        {
                          "itemType": "Executable",
                          "id": "exec2"
                        }
                      ]
                    }
                  }
                ],
                "end": []
              }
            }
          ],
          "end": []
        }
      },
      {
        "level": "1",
        "contents": {
          "title": "C2",
          "category": "c",
          "start": [],
          "middle": [
            {
              "level": "2",
              "contents": {
                "title": "M1",
                "category": "m",
                "start": [],
                "middle": [
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT1",
                      "middle": [
                        {
                          "itemType": "Data"
                        }
                      ]
                    }
                  },
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT2",
                      "middle": [
                        {
                          "itemType": "Executable",
                          "id": "exec3"
                        }
                      ]
                    }
                  },
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT3",
                      "middle": [
                        {
                          "itemType": "Data"
                        }
                      ]
                    }
                  }
                ],
                "end": []
              }
            },
            {
              "level": "2",
              "contents": {
                "title": "M2",
                "category": "m",
                "start": [],
                "middle": [
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT1",
                      "middle": [
                        {
                          "itemType": "Data"
                        }
                      ]
                    }
                  },
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT2",
                      "middle": [
                        {
                          "itemType": "Executable",
                          "id": "exec4"
                        }
                      ]
                    }
                  },
                  {
                    "level": "3",
                    "contents": {
                      "title": "MAT3",
                      "middle": [
                        {
                          "itemType": "Data"
                        }
                      ]
                    }
                  }
                ],
                "end": []
              }
            }
          ],
          "end": []
        }
      }
    ],
    "end": []
  }
}
上下文
  • 带有嵌套对象1的json
  • jsonpath表达式语言
  • 在jsonpath和jmespath(或其他JSON表达式引擎)之间选择
问题
  • DeveMasterJoe2希望从嵌套的JSON中提取一些值
讨论
  • 有很多jsonpath的实现,它们并不都支持相同的特性
  • 源JSON的结构和规范化将影响使用纯jsonpath实现这一点的容易程度
  • 在选择JSON表达式引擎时,必须权衡多个因素
    • 跨语言实现的一致性如何
    • 一种语言有多少种选择
    • 规格有多清晰
    • 有多少示例、单元测试或教程可用
    • 谁在支持它
使用Python和jsonpath ng的示例解决方案
  • 下面是一个使用Python3.7和jsonpath ng的示例解决方案
  • 这个例子使用了jsonpath和python的混合,而不仅仅是纯jsonpath,因为它嵌套了大量的JSON
    • 我将留给其他人提供一个依赖于纯jsonpath的答案
  • 请注意,源JSON可能需要稍微清理一下
    • (例如,为什么没有id字段附加到
      itemType==Data
      元素?)
    • (例如,为什么在所有
      内容
      元素上都找不到
      类别
    • (例如,如果您明确指定了
      级别
      ,那么当您可以通过
      级别
      ?)确定深度时,为什么要使用嵌套严重的对象使事情复杂化呢?)
这个例子:

导入库 导入编解码器 导入json 导入jsonpath\u ng 从jsonpath_ng.ext导入解析 ##;; ##初始化变量 href=“path/to/my/jsonfile/nested_dict.json” json_string=codecs.open(href'rb',encoding='utf8').read() json\u dataroot=json.loads(json\u字符串) 最终结果=[] ##;; ##init jsonpath外部查询 match=parse(“$…contents.middle[*]”)。find(json_dataroot) ##;; ##遍历外部查询并收集子元素 对于ijj,枚举中的项目(匹配): ##限制到所需类别=='m' 如果(匹配[ijj].value.get('contents',{}).get('category','')='m'): ##提取出所需的子元素 json_datafrag001=[item.get('contents',{}).get('middle',{})[0] 对于匹配项[ijj].value.get('contents',{}.get('middle',{})中的项 ] match001=parse(“$[?(@.itemType=='Executable')]”)。find(json_datafrag001) 最终结果。扩展(列表(match001[ikk]。ikk的值,枚举(match001)中的项) 通过 ##;; ##显示最终结果 dumps(最终结果,排序键=True,缩进=4,分隔符=(',',':')) 打印(vout) ##;; 。。。产生这个结果

[
{
“id”:“exec1”,
“itemType”:“可执行文件”
},
{
“id”:“exec2”,
“itemType”:“可执行文件”
},
{
“id”:“exec3”,
“itemType”:“可执行文件”
},
{
“id”:“exec4”,
“itemType”:“可执行文件”
}
]


1(又名字典、关联数组、散列)

对不起,我应该早点提到这一点。这不是我必须处理的实际json。这是一种经过消毒的仿制品。花了一段时间和手工制作的模仿。因此,它不是一个完美的复制品。好的,另一个可能有帮助的方面是您打算使用的编程语言或环境。