Как утверждать, что узел JSON имеет дочерние узлы с определенными значениями, присвоенными им?

У меня есть строка JSON, как показано ниже:

json = "{\"Things\": \n" +
 " {\"Thing\": {\n" +
 " \"ID\":\"123\",\n" +
 " \"name\":\"Yet Another Thing\",\n" +
 " \"price\":\"$12.99\",\n" }\n" +
 " }\n" +
 "}";

Есть ли способ, которым я могу утверждать, что ID Thing равен 123 И что это name " Yet Another Thing " в том же самом утверждении/утверждении?

На данный момент я, кажется, не с помощью фильтров:

JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name")

Я получаю следующее исключение:

java.lang.IllegalArgumentException: недопустимый контейнерный объект

Может быть, потому, что в строке JSON нет строковой записи []? Должно быть?

Что касается примечания, есть ли хорошее введение в использование Hamcrest (с утверждением JSON)? Я знаю официальный учебник, но я всегда, кажется, ошибаюсь...

ОБНОВЛЕНИЕ: рациональным для этого было: что, если я получу несколько элементов Thing назад, о чьем заказе у меня нет гарантии (поэтому я не могу соответствовать Thing[1] (если я не зациклил их все))? Как я могу убедиться, что у одного элемента есть оба, правильный ID и правильное имя? Если я проверяю детей отдельно, не рискую ли я, что у одной Thing есть правильное имя, а у другого - правильный ID, но ни у кого нет? (Было бы возможно, если бы этот формат JSON, или я должен был бы иметь массив в этом случае в любом случае, например "Thing": [ {... }, {... } ],...?

PS: Я попытался использовать JsonPath выше, как показано ниже: assertEquals("Yet Another Thing", JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name"));Так что там, где могло возникнуть исключение.Кроме того, я изначально задал этот вопрос в списке рассылки JsonPath, но до сих пор не получил никаких ответов, поэтому надеялся, что я смогу получить помощь здесь быстрее... :)

1 ответ

Учебник дает решение вашей проблемы, кажется:

JsonAssert.with(json).assertThat("$.Things.Thing.ID", Matchers.equalTo("123"))
 .assertThat("$.Things.Thing.name", Matchers.equalTo("Yet Another Thing"));

licensed under cc by-sa 3.0 with attribution.