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

Pal*_*ali 2 json jsonpath

几个小时的阅读和尝试所有的我脑子里浮现的JSON路径表达式之后,两个逻辑表达式和无感表情,我仍然不知道我怎么能提取所有cmis:objectId地方cmis:objectTypeId等于F:cm:custom从所有object对象,无论嵌套深度:

{

    {...   [... 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"

}
Run Code Online (Sandbox Code Playgroud)

我尝试并从数百次尝试中节省下来的一些东西:

$.[*]..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
Run Code Online (Sandbox Code Playgroud)

注意:我使用的是http://www.jsonquerytool.com/,因为我使用的是JMeter插件“ JSON Path Extractor”,而此插件使用的是http://goessner.net/articles/JsonPath/

Dun*_*can 6

从您的问题中我不确定您是否还需要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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是查询。使用$..object..它可以查找对象下任何位置的所有对象object,然后仅按具有cmis:objectTypeId属性的对象过滤它们:

$..object..[?(@['cmis:objectTypeId']=="F:cm:custom")].cmis:objectId
Run Code Online (Sandbox Code Playgroud)

这些是结果(我也使用http://www.jsonquerytool.com对其进行了测试):

[
    "11111111-4563-4302-bba9-222222222222",
    "39cdd896-4563-4302-bba9-398006572522"
]
Run Code Online (Sandbox Code Playgroud)

之类的东西$..succinctProperties[?(@['cmis:objectTypeId']=="F:cm:custom")]什么都不返回的原因是因为JSON Path通常期望被过滤的实体(在这种情况下为succinctProperties)是一个对象数组。的@是指该阵列中的一个对象。由于succinctProperties不是数组,因此将对象的各个属性视为数组的一部分,因此cmis:objectTypeIdsuccinctProperties而不是succinctProperties自身的每个属性上查找该属性。因此,仅当您具有如下结构时,它才会匹配:

{
    "succinctProperties": {
        "property": {
            "cmis:objectTypeId": "F:cm:custom",
            "cmis:objectId": "3333333-4563-4302-bba9-4444444444"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)