经过几个小时的阅读和尝试了我脑海中出现的所有 JSON 路径表达式(包括逻辑表达式和无意义表达式),我仍然不知道如何提取所有 cmis:objectId
其中,cmis:objectTypeId
等于所有 object
对象中的 F:cm:custom
,无论嵌套深度如何:
{
{... [... nested objects and arrays as needed for a tree strucutre
object : {
"succinctProperties": {
"cmis:objectTypeId": "F:cm:custom",
"cmis:objectId": "39cdd896-4563-4302-bba9-398006572522",
...
}
},
}... }... close nested objects and arrays as needed for a tree strucutre
"id": "e244881e-e96b-406b-8d1f-faecae35d7f2"
}
我在一百次尝试中尝试并保存的一些东西:
$.[*]..succinctProperties[?(@['cmis:objectTypeId']=='F:wim:caseEntries')].cmis:objectId
$.[*]..succinctProperties.cmis:objectId // Returns ALL without condition
$.[*].*..succinctProperties[?(@.['cmis:objectTypeId']=='F:wim:caseEntries')]
$.[*]..succinctProperties[@.cmis:objectTypeId=='F:wim:caseEntries')].cmis:objectId
注意:我使用 http://www.jsonquerytool.com/ 是因为我使用 JMeter 插件“JSON Path Extractor”,并且该插件使用 http://goessner.net/articles/JsonPath/
最佳答案
从您的问题中我不确定您是否需要 cmis:objectTypeId
始终直接位于 succinctProperties
对象下,还是只需要位于 object
对象下的某个位置。如果是后者,我相信我可以解决你的问题。对于前者,我相信您可能已经达到了 JSON Path 的极限。
我使用此示例 JSON 来测试查询:
{
"anotherobject": {
"object" : {
"someothernesting": {
"succinctProperties": {
"cmis:objectTypeId": "F:cm:custom",
"cmis:objectId": "39cdd896-4563-4302-bba9-398006572522"
}
}
}
},
"object" : {
"succinctProperties": {
"cmis:objectTypeId": "F:cm:custom",
"cmis:objectId": "11111111-4563-4302-bba9-222222222222"
}
},
"noobject": {
"succinctProperties": {
"cmis:objectTypeId": "F:cm:custom",
"cmis:objectId": "3333333-4563-4302-bba9-4444444444"
}
}
}
这是查询。使用 $..object..
,它会查找 object
对象下任何位置的所有对象,然后仅通过具有 cmis:objectTypeId
属性的对象来过滤它们:
$..object..[?(@['cmis:objectTypeId']=="F:cm:custom")].cmis:objectId
这些是结果(我也使用http://www.jsonquerytool.com来测试它):
[
"11111111-4563-4302-bba9-222222222222",
"39cdd896-4563-4302-bba9-398006572522"
]
像 $..succinctProperties[?(@['cmis:objectTypeId']=="F:cm:custom")]
这样的东西什么也不返回的原因是因为 JSON Path 通常期望被过滤的实体(在本例中为 succinctProperties)是一个对象数组。 @
引用数组中的一个对象。由于 succinctProperties
不是数组,因此它将对象的各个属性视为数组的一部分,因此在 cmis:objectTypeId
的每个属性上查找 succinctProperties
属性,而不是在 succinctProperties
本身上查找。因此,如果您有这样的结构,它只会匹配某些内容:
{
"succinctProperties": {
"property": {
"cmis:objectTypeId": "F:cm:custom",
"cmis:objectId": "3333333-4563-4302-bba9-4444444444"
}
}
}
关于JSONPath - 获取对象 othervalue 等于字符串的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455219/