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

标签 json jsonpath

经过几个小时的阅读和尝试了我脑海中出现的所有 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/

相关文章:

javascript - 使用 JSON 数据创建折叠

java - 使用 Jackson 将 JSON 数组反序列化为具有私有(private)列表属性的对象

kubernetes - 一个用于获取 secret 名称和 secret token 的 liner 命令

java - 通过 JsonPath 中的正则表达式过滤值

android - 无法读取原生 JSON 数据

javascript - 试图定义嵌套对象

kubernetes - 获取最近创建的 Pod 的名称

jsonpath - 如何在 Angular 2+ 中使用功能齐全的 JsonPath?

java - 从 Json 路径查询返回并在 Junit 断言中使用的字符串的排序

javascript - Jasmine 无法读取有效的 json 文件