从JSONPath中数组的不同对象中查询具有特定值的键

时间:2019-09-18 05:17:45

标签: java jsonpath

{
  "dataObject": [
    {
      "id": 263626,
      "role": {
        "id": 12054,
        "name": "Edit",
        "description": ""
      },
      "resource": {
        "id": 5756,
        "type": "resource"
      }
    },
    {
      "id": 263364,
      "role": {
        "id": 12054,
        "name": "Edit",
        "description": ""
      },
      "resource": {
        "id": 5728,
        "type": "resource"
      }
    }
  ]
}

我有一个看起来像这样的JSON对象。我需要从具有dataObject和id:name:Edit的{​​{1}}中提取json对象。 如何使用JSON路径实现此目的? 尝试了5756无效的问题。

Java代码:

$..[?(@.name="Edit", @.id=5756)]

1 个答案:

答案 0 :(得分:1)

尝试使用父对象名称和逻辑运算符AND。结果路径将是

$..[?((@.resource.id == 5756) && (@.role.name == 'Edit'))]

使用com.jayway.jsonpath:json-path:2.4.0进行单元测试对我来说很有用

@Test
public void testParse() {
    String json = "{\n" +
            "  \"dataObject\": [\n" +
            "    {\n" +
            "      \"id\": 263626,\n" +
            "      \"role\": {\n" +
            "        \"id\": 12054,\n" +
            "        \"name\": \"Edit\",\n" +
            "        \"description\": \"\"\n" +
            "      },\n" +
            "      \"resource\": {\n" +
            "        \"id\": 5756,\n" +
            "        \"type\": \"resource\"\n" +
            "      }\n" +
            "    },\n" +
            "    {\n" +
            "      \"id\": 263364,\n" +
            "      \"role\": {\n" +
            "        \"id\": 12054,\n" +
            "        \"name\": \"Edit\",\n" +
            "        \"description\": \"\"\n" +
            "      },\n" +
            "      \"resource\": {\n" +
            "        \"id\": 5728,\n" +
            "        \"type\": \"resource\"\n" +
            "      }\n" +
            "    }\n" +
            "  ]\n" +
            "}";

    DocumentContext parse = JsonPath.parse(json);
    Object read = parse.read("$..[?((@.resource.id == 5756) && (@.role.name == 'Edit'))]");
    assertNotNull(read);
}