JsonPath-提取满足多个条件的对象?
在下面给出的Json字符串中,我想找到category=m且“middle”数组包含符合此条件的元素的所有元素——元素的“middle”数组具有itemType=Executable的对象 我想使用jsonpath来获得所需的对象。我不喜欢使用jmespath,因为它对于我来说太复杂了。但是,我不熟悉jsonpath,我无法从在线教程中理解json查询,这些教程太琐碎或太基本。我想知道使用编程语言来获取我需要的数据是否更好。请告知 到目前为止,我只能通过使用这个jsonpath查询来提取category=m的元素JsonPath-提取满足多个条件的对象?,json,jsonpath,nested-object,Json,Jsonpath,Nested Object,在下面给出的Json字符串中,我想找到category=m且“middle”数组包含符合此条件的元素的所有元素——元素的“middle”数组具有itemType=Executable的对象 我想使用jsonpath来获得所需的对象。我不喜欢使用jmespath,因为它对于我来说太复杂了。但是,我不熟悉jsonpath,我无法从在线教程中理解json查询,这些教程太琐碎或太基本。我想知道使用编程语言来获取我需要的数据是否更好。请告知 到目前为止,我只能通过使用这个jsonpath查询来提取cate
$.[?(@.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表达式引擎时,必须权衡多个因素
- 跨语言实现的一致性如何
- 一种语言有多少种选择
- 规格有多清晰
- 有多少示例、单元测试或教程可用
- 谁在支持它
- 下面是一个使用Python3.7和jsonpath ng的示例解决方案
- 这个例子使用了jsonpath和python的混合,而不仅仅是纯jsonpath,因为它嵌套了大量的JSON
- 我将留给其他人提供一个依赖于纯jsonpath的答案
- 请注意,源JSON可能需要稍微清理一下
- (例如,为什么没有id字段附加到
元素?)itemType==Data
- (例如,为什么在所有
元素上都找不到内容
)类别
- (例如,如果您明确指定了
,那么当您可以通过级别
?)确定深度时,为什么要使用嵌套严重的对象使事情复杂化呢?)级别
- (例如,为什么没有id字段附加到
[
{
“id”:“exec1”,
“itemType”:“可执行文件”
},
{
“id”:“exec2”,
“itemType”:“可执行文件”
},
{
“id”:“exec3”,
“itemType”:“可执行文件”
},
{
“id”:“exec4”,
“itemType”:“可执行文件”
}
]
1(又名字典、关联数组、散列)对不起,我应该早点提到这一点。这不是我必须处理的实际json。这是一种经过消毒的仿制品。花了一段时间和手工制作的模仿。因此,它不是一个完美的复制品。好的,另一个可能有帮助的方面是您打算使用的编程语言或环境。