Как игнорировать @JsonProperty при преобразовании объекта в карту по Джексону - PullRequest
1 голос
/ 12 февраля 2020

Например, у меня есть класс User, который имеет только 2 поля - name и identification, которые аннотируются @JsonProperty соответственно. И я использую Jackson для преобразования этого объекта в Map, но результат не тот, который я ожидал. Я хочу, чтобы все ключи в карте результатов были такими, как я объявил в User, а не в @JsonProperty.

Пользователь класса

class User {
    @JsonProperty("username")
    private String name;

    @JsonProperty("id")
    private int identification;

    //constructor, getters, setters and toString
}

Фрагмент кода

ObjectMapper mapper = new ObjectMapper();
User user = new User("Bob", 123);
System.out.println(user.toString());

Map<String, Object> result = mapper.convertValue(user, Map.class);
System.out.println(result.toString());

Вывод на консоль

Пользователь [имя = Боб, идентификация = 123]
{ username = Bob, id = 123}

Но то, что я ожидал для карты, выглядит следующим образом. Имя поля должно быть таким же, как определено в классе Пользователь , а не в значении, указанном в @JsonProperty. Кстати, я не могу удалить @JsonProperty, потому что они где-то используются для сериализации / десериализации.

{имя = Боб, идентификация = 123}

Любые советы и предложения будет с благодарностью. Спасибо!

Ответы [ 4 ]

2 голосов
/ 12 февраля 2020

Вы должны настроить свой объект сопоставления следующим образом (но он будет игнорировать все аннотации)

ObjectMapper mapper = new ObjectMapper();
mapper.disable(MapperFeature.USE_ANNOTATIONS);

Я нашел другой способ, который отключает только настройку имени из @JsonProperty и оставляет другое свойство от @JsonProperty и других аннотаций Джексона. Если вы хотите отключить некоторые дополнительные аннотации (или часть аннотации) - переопределите метод, который его реализует

mapper.setAnnotationIntrospector( new JacksonAnnotationIntrospector() {
            @Override
            public PropertyName findNameForSerialization(Annotated a) {
                return null;
            }
        });
0 голосов
/ 12 февраля 2020

Я знаю несколько способов добиться этого:

  1. Используется @JsonSetter & @JsonGetter для манипулирования именами сериализации / десериализации. Пример:

    @JsonGetter("name")
    public String getName() {
        return name;
    }
    
    //# Used during deserialization
    @JsonSetter("username")
    public void setName(String name) {
        this.name = name;
    }
    
  2. Чтобы использовать @ JsonAlias ​​ для предоставления псевдонима для десириализации

0 голосов
/ 12 февраля 2020

Удалить @ JsonProperty из полей

0 голосов
/ 12 февраля 2020

Вы просто удаляете JsonProperty. Затем он автоматически сопоставится с именем свойства.

JsonProperty аннотация просто поможет вам указать имя поля, которое отличается от имени вашего свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...