Утверждение объектов Array в JSonPath с ключом - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь получить конкретный элемент массива не по позиции массива, а по ключу содержимого.

Пример JSON:

{"items": [{
        "key": "prop-name",
        "label": "Provider",
        "type": "DROPDOWN",
        "items": ["bla", "blub", "what", "ever"]
    }, {
        "key": "prop-modes",
        "label": "Transport modes",
        "type": "CHECKBOX",
        "items": ["AIR", "RAIL", "ROAD", "SEA"]
    }
]}
private static String URL_GLOBAL_FILTER = "/global-filter";
private static String PROP_NAME = "prop-name";

mvc.perform(get(URL_GLOBAL_FILTER).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
   .andExpect(jsonPath("$.items", hasSize(10)))
   .andExpect(jsonPath("$.items[?((@.key === \"" + PROP_NAME + "\" && @.type === \"DROPDOWN\"))]").exists())
   .andExpect(jsonPath("$.items[0].items", hasSize(4)));

Это прекрасно работает. Но то, что я хочу сделать, это что-то вроде:

.andExpect(jsonPath("$.items[?(@.key == \"prop-name\")].items", containsString("bla")))

Но это выдает следующую ошибку:

java.lang.AssertionError: JSON path "$.items[?(@.key == "prop-name")].items"

Ожидается: строка, содержащая «бла» но: был net.minidev.json.JSONArray (<[["bla", "blub", "what", "ever"]]>)

Что означает < >? Как получить доступ к массиву внутри?

В jsonQueryTool похоже, что я хочу.

(ОБНОВЛЕННЫЙ вопрос)

1 Ответ

2 голосов
/ 22 мая 2019

Вы пробовали использовать устройство hasItem от Hamcrest?

import static org.hamcrest.Matchers.*;

.andExpect(jsonPath("$.items[?(@.key == 'prop-name')].items[*]", hasItem("bla")));
...