Обрабатывать примитивные типы объединения при JSON (де) сериализации с помощью Jackson в Java

#java #json #jackson #polymorphism

#java #json #джексон #полиморфизм

Вопрос:

Я знаю, что по этой теме уже есть пара вопросов, но я все еще пытаюсь найти хорошее решение для примитивных типов. Я пытаюсь сериализовать и десериализовать следующие данные JSON:

 {
  "key": "key1"
  "value": "value1"
}
  

Однако значение является типом объединения и может быть либо логическим значением, либо числом, либо строкой. Таким образом, это также допустимые входные данные:

 {
  "key": "key2"
  "value": true
}
  

и

 {
  "key": "key3"
  "value": 3
}
  

Каков наилучший способ сериализации и десериализации этого в Java POJO? Мой подход выглядит следующим образом (но, очевидно, работает только со строковыми значениями)

 @RequiredArgsConstructor
@Getter
@EqualsAndHashCode
public class Request {

    private final String key;

    private final String value;
}

@RequiredArgsConstructor
@Getter
@EqualsAndHashCode
public class Response {

    private final String key;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private final String value;
}
  

Комментарии:

1. Для получения преобразованного объекта вам нужен DTO. Очевидно, String value что не может содержать логическое значение. Итак, вы должны сначала показать нам свой DTO. Может быть, вы хотите использовать Object value ?

2. Где / как мне сохранить информацию о типе затем во время де (сериализации)? Я почему-то неправильно настраиваю аннотации @JsonTypeInfo

Ответ №1:

Решил это таким образом.

 @RequiredArgsConstructor
@Getter
@EqualsAndHashCode
public class Request {

    private final String key;

    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "valueClass")
    private final String value;

    private final String valueClass;
}

@RequiredArgsConstructor
@Getter
@EqualsAndHashCode
public class Response {

    private final String key;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "valueClass")
    private final String value;

    @JsonIgnore
    private final String valueClass;
}