t.me/atinfo_chat Telegram группа по автоматизации тестирования

Получить значение из JSON Rest Assured Java

Теги: #<Tag:0x00007f748a8c8920> #<Tag:0x00007f748a8c8858> #<Tag:0x00007f748a8c8790> #<Tag:0x00007f748a8c86c8> #<Tag:0x00007f748a8c8600>

Привет) Пробую получить значение из json:

{
    "message": "The given data was invalid.",
    "errors": {
        "client.email": [
            "invalid email"
        ]
    }
}

Мне нужно вытянуть “invalid email”.

Делал, вот так :

Map<String, String> message= response.jsonPath().getMap("errors");
        String value = message.get("client.email");

Ошибка:java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.lang.String (java.util.ArrayList and java.lang.String are in module java.base of loader ‘bootstrap’)

Возможно можно, через response.getBody() это сделать?
Eсли делаю вот так:
response.then().assertThat().body("errors.client.email", equalTo("invalid email"));
Возвращает null

я так полагаю у вас неверный jsonpath
попробуйте

$.errors[client.email][0]

Так тоже null

говорит же правду

Map<String, List<String>> messages= response.jsonPath().getMap("errors");
        String value = messages.get("client.email").get(0);
1 Симпатия

У вас в респонсе текст “invalid email” лежит в ArrayList, a вы его пытаетесь засунуть в Map. Поменяйте Map на ArrayList

1 Симпатия

@sergueik @Vladislav_Sobol спасибо работает) А можно как-то через body прописать путь?
Например body(“errors.client.email”)

@Leon

	//@formatter:off
	private static String data = "{\n"
			+ "    \"message\": \"The given data was invalid.\",\n" 
			+ "    \"errors\": {\n"
			+ "        \"email\": [\n" 
			+ "            \"invalid email\"\n" 
			+ "        ]\n" 
			+ "    }\n" 
			+ "}";

	//@formatter:on
		JsonPath jsonPath = new JsonPath(data);
		assertThat(jsonPath.get("errors.email[0]"), containsString("invalid email"));

для того чтобы выполнить given() .when().get(baseUrl).then().body( - надо запускать веб сервер чтобы данные получать от него - сейчас честно говоря нет времени это делать

@Leon