JSONPath - 获取对象其他值等于字符串的所有值

JSONPath - get all values where object othervalue equals string

经过几个小时的阅读和尝试所有出现在我脑海中的 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/ because I use the JMeter Plugin "JSON Path Extractor" and this plugin uses 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")] returns nothing 之类的原因是因为 JSON Path 通常期望被过滤的实体(在本例中为 succinctProperties)是一个对象数组。 @ 指的是数组中的一个对象。由于 succinctProperties 不是数组,它将对象的各个属性视为数组的一部分,因此在 [=15= 的每个 属性 上查找 cmis:objectTypeId 属性 ] 而不是 succinctProperties 本身。因此,它只会匹配具有如下结构的内容:

{
    "succinctProperties": {
        "property": {
            "cmis:objectTypeId": "F:cm:custom",
            "cmis:objectId": "3333333-4563-4302-bba9-4444444444"
        }
    }
}