Как создать переменную с дефисом в Java или как сделать подмену
Есть такая часть Json ответа.
> "headers": {
> "Accept": "*/*",
> "Accept-Encoding": "gzip, deflate, br",
> "Cache-Control": "no-cache",
> "Host": "httpbin.org",
> "Postman-Token": "3d71295d-8608-4674-b962-940b8b02f12c",
> "User-Agent": "PostmanRuntime/7.30.0",
> "X-Amzn-Trace-Id": "Root=1-63ac8e2c-5d4fc9243d472e2370145717"
> }
Мне нужно в дальнейшем с помощью given() спарсить в List, ну и сделать проверки. Создал класс где у меня указаны переменные, конструктор класса и геттеры на поля.
public class HttpbinDelete {
@JsonProperty("Accept")
private String accept;
@JsonProperty("Accept-Encoding")
private String acceptEncoding;
@JsonProperty("Cache-Control")
private String cacheControl;
@JsonProperty("Host")
private String host;
@JsonProperty("Postman-Token")
private String postmanToken;
@JsonProperty("User-Agent")
private String userAgent;
@JsonProperty("X-Amzn-Trace-Id")
private String xAmznTraceId;
public HttpbinDelete(String accept, String acceptEncoding, String cacheControl, String host, String postmanToken, String userAgent, String xAmznTraceId) {
this.accept = accept;
this.acceptEncoding = acceptEncoding;
this.cacheControl = cacheControl;
this.host = host;
this.postmanToken = postmanToken;
this.userAgent = userAgent;
this.xAmznTraceId = xAmznTraceId;
}
public String getAccept() {
return accept; }
public String getAcceptEncoding() {
return acceptEncoding; } и т.д. для всех переменных
Сам тест
@Test
public void httpBinDelete () {
String host = "httpbin.org";
HttpbinDelete httpBinDelete = given()
.when()
.delete("/delay/5")
.then().log().all()
.extract().as(HttpbinDelete.class);
Assert.assertEquals(host, httpBinDelete.getHost());
}
Получаю ошибку:
java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "args" (class httpbinorg.HttpbinDelete), not marked as ignorable (7 known properties: "Cache-Control", "User-Agent", "Postman-Token", "Accept", "X-Amzn-Trace-Id", "Accept-Encoding", "Host"])
at [Source: (String)"{
Понимаю, что имена полей не соответствуют переменным и не могут быть найдены. Когда поля в Json без дефиса, то проблем нет. Вопрос: как подменить может наименования полей Json для Java, чтобы сопоставление было. Гуглил весь вечер, не нашел подходящего ответа.
Ответы (2 шт):
Вы не приложили полный код структуры данных и JSON, который пытаетесь обработать. В приложенном Вами фрагменте структуры данных и JSON нет ошибок.
У вас ругается на поле args — Unrecognized field "args" (class httpbinorg.HttpbinDelete), not marked as ignorable. Такая ошибка может возникнуть, когда Вы пытаетесь "распарсить" JSON в какую-либо структуру данных, но в JSON существует поле, которого нет в структуре.
Условно говоря, вот:
private static final String RESPONSE = "" +
"{\n" +
" \"Accept\": \"*/*\",\n" +
" \"Accept-Encoding\": \"gzip, deflate, br\",\n" +
" \"Cache-Control\": \"no-cache\",\n" +
" \"Host\": \"httpbin.org\",\n" +
" \"Postman-Token\": \"3d71295d-8608-4674-b962-940b8b02f12c\",\n" +
" \"User-Agent\": \"PostmanRuntime/7.30.0\",\n" +
" \"X-Amzn-Trace-Id\": \"Root=1-63ac8e2c-5d4fc9243d472e2370145717\",\n" +
" \"args\": \"asds\"\n" +
"}";
public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final HttpbinDelete object = mapper.readValue(RESPONSE, HttpbinDelete.class);
System.out.println(object);
}
Данный фрагмент кода вызовет подобную ошибку, но если убрать поле args из JSON, то ошибки не будет. Если убрать не получиться, то просто поставьте игнорирование неизвестных свойств:
private static final String RESPONSE = "" +
"{\n" +
" \"Accept\": \"*/*\",\n" +
" \"Accept-Encoding\": \"gzip, deflate, br\",\n" +
" \"Cache-Control\": \"no-cache\",\n" +
" \"Host\": \"httpbin.org\",\n" +
" \"Postman-Token\": \"3d71295d-8608-4674-b962-940b8b02f12c\",\n" +
" \"User-Agent\": \"PostmanRuntime/7.30.0\",\n" +
" \"X-Amzn-Trace-Id\": \"Root=1-63ac8e2c-5d4fc9243d472e2370145717\",\n" +
" \"args\": \"asds\"\n" +
"}";
public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
final HttpbinDelete object = mapper.readValue(RESPONSE, HttpbinDelete.class);
System.out.println(object);
}
P.S. Прошу обратить внимание на .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); — именно это включает игнорирование неизвестных свойств.
P.S.S. Данная настройка действует только для com.fasterxml.jackson. Если же у Вас GSON или что-то ещё, то настраивать Вам нужно по-другому. Увы, я не знаю какая библиотека используется у Вас
Используйте аннотацию @JsonIgnoreProperties(ignoreUnknown = true) на уровне класса, чтобы десериализация проходила без лишних исключений.
@JsonIgnoreProperties(ignoreUnknown = true)
public class HttpbinDelete {
// ...
}