Ключ сериализации Джексона и значение из одного объекта

Я пытаюсь создать настраиваемый сериализатор для создания объекта 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"    
                           }
}

Есть идеи, как этого добиться?

Что это за вход?

baao 12.06.2018 17:10

А как насчет простого поиска в Google? baeldung.com/jackson-object-mapper-tutorial

jbx 12.06.2018 17:15

@jbx, я погуглил, но результатов нет, даже ссылка, которую вы отправили, не демонстрирует, как этого добиться.

Wild Goat 12.06.2018 17:18

@WildGoat Тогда ваш вопрос не совсем ясен, чего вы хотите достичь. Вы упоминаете Pair, что означает, что ваш объект имеет только один ключ и одно значение, но требуемые выходные данные показывают объект с несколькими ключами и значениями. Как вы воображаете, что это волшебным образом вписывается в вашу пару, не совсем ясно.

jbx 12.06.2018 17:24

@jbx, это может быть любой объект внутри. Например Человек. См. Обновленный ответ

Wild Goat 12.06.2018 17:44

@WildGoat Тогда почему бы вам просто не аннотировать поля Person с помощью правильных ключей свойств JSON? Итак, @JsonProperty("id") int id; @JsonProperty("name") String name;

jbx 13.06.2018 12:48

@jbx, как это поможет? Имея один объект, мне нужна вложенная структура. Например, id - это ключ для человека, но не имеющий этой информации рядом друг с другом. Пожалуйста, посмотрите мой пример вывода.

Wild Goat 13.06.2018 15:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
1 006
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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 дает вам этот вывод? Потому что для меня он по-прежнему выводит «значение» и «ключ» при сериализации карты. Есть идеи, как этого избежать?

Wild Goat 13.06.2018 15:19

@WildGoat Я использую Jackson 2.9 и тестировал код, указанный в ответе. Никакими геттерами, кроме getData(), не пользуюсь. Если у вас есть другие геттеры, аннотируйте их с помощью @JsonIgnore.

cassiomolin 13.06.2018 15:21

Спасибо! Вы правы, я просто забыл удалить геттеры.

Wild Goat 13.06.2018 15:33

Другие вопросы по теме