Как создать переменную с дефисом в 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 шт):

Автор решения: ulxanxv

Вы не приложили полный код структуры данных и JSON, который пытаетесь обработать. В приложенном Вами фрагменте структуры данных и JSON нет ошибок.

У вас ругается на поле argsUnrecognized 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 или что-то ещё, то настраивать Вам нужно по-другому. Увы, я не знаю какая библиотека используется у Вас

→ Ссылка
Автор решения: Nowhere Man

Используйте аннотацию @JsonIgnoreProperties(ignoreUnknown = true) на уровне класса, чтобы десериализация проходила без лишних исключений.

@JsonIgnoreProperties(ignoreUnknown = true)
public class HttpbinDelete {
// ...
}
→ Ссылка