Я пытаюсь создать настраиваемый сериализатор для создания объекта Pair, но я хочу избежать полей «ключ» и «значение» при сериализации объекта.
Объект pojo:
public class TypeObjectPair implements Serializable {
private final String canonicalObjectName;
private final Object object;
public String getKey() {
return canonicalObjectName;
}
public Object getValue() {
return object;
}
}
Класс человека. (Теоретически может быть любой другой объектный класс)
class Person{
int id;
String name;
}
Последний объект для сериализации:
TypeObjectPair obj = new TypeObjectPair("com.example.Person", new Person(1, "Peter"));
Требуемый вывод:
{
"com.example.object" : {
"id" : 1,
"name" : "Peter"
}
}
Есть идеи, как этого добиться?
А как насчет простого поиска в Google? baeldung.com/jackson-object-mapper-tutorial
@jbx, я погуглил, но результатов нет, даже ссылка, которую вы отправили, не демонстрирует, как этого добиться.
@WildGoat Тогда ваш вопрос не совсем ясен, чего вы хотите достичь. Вы упоминаете Pair, что означает, что ваш объект имеет только один ключ и одно значение, но требуемые выходные данные показывают объект с несколькими ключами и значениями. Как вы воображаете, что это волшебным образом вписывается в вашу пару, не совсем ясно.
@jbx, это может быть любой объект внутри. Например Человек. См. Обновленный ответ
@WildGoat Тогда почему бы вам просто не аннотировать поля Person с помощью правильных ключей свойств JSON? Итак, @JsonProperty("id") int id; @JsonProperty("name") String name;
@jbx, как это поможет? Имея один объект, мне нужна вложенная структура. Например, id - это ключ для человека, но не имеющий этой информации рядом друг с другом. Пожалуйста, посмотрите мой пример вывода.




Вы можете использовать Map<K, V> с @JsonAnyGetter:
public class TypeObjectPair {
private Map<String, Object> data = new HashMap<>();
public TypeObjectPair(String key, Object value) {
data.put(key, value);
}
@JsonAnyGetter
public Map<String, Object> getData() {
return data;
}
}
Затем используйте следующее:
ObjectMapper mapper = new ObjectMapper();
TypeObjectPair pair = new TypeObjectPair("com.example.object", new Person(1, "Peter"));
String json = mapper.writer().withDefaultPrettyPrinter().writeValueAsString(pair);
Результатом будет:
{
"com.example.object" : {
"id" : 1,
"name" : "Peter"
}
}
какая версия jackson дает вам этот вывод? Потому что для меня он по-прежнему выводит «значение» и «ключ» при сериализации карты. Есть идеи, как этого избежать?
@WildGoat Я использую Jackson 2.9 и тестировал код, указанный в ответе. Никакими геттерами, кроме getData(), не пользуюсь. Если у вас есть другие геттеры, аннотируйте их с помощью @JsonIgnore.
Спасибо! Вы правы, я просто забыл удалить геттеры.
Что это за вход?