Пользовательская сериализация на основе определенного пользователем значения

#java #json #serialization #jackson #fasterxml

#java #json #сериализация #джексон #fasterxml

Вопрос:

У меня есть pojo :

 @JsonIgnoreProperties(ignoreUnknown = true)
public class Item
{
   String name;

   Long baseId;

   @JsonIgnore
   String status;
}
 

Я использую этот объект Java для вызовов API GET, POST и PUT. Я использовал аннотации @JsonIgnore, чтобы избежать сериализации (поэтому он не будет сериализован для запросов PUT и POST, но я получил для запроса GET). Теперь мне нужно, чтобы BaseID был сериализован для запроса POST, а не для запроса PUT. Пожалуйста, предложите мне решения.

Ответ №1:

Вы можете рассмотреть возможность использования представлений Jackson Json. По сути, вы заменяете @JsonIgnore аннотацию в аннотации представления Джексона типом представления и включаете его в зависимости от контекста. Вот пример простого сопоставления объектов:

 public class JacksonView {

    public static interface View1 {
    }

    public static interface View2 {
    }

    public static class Bean {
        @JsonView(View1.class)
        public final String field1;
        @JsonView(View2.class)
        public final String field2;
        public final String field3;

        public Bean(String field1, String field2, String field3) {
            this.field1 = field1;
            this.field2 = field2;
            this.field3 = field3;
        }
    }
    public static void main(String[] args) throws JsonProcessingException {
        Bean bean = new Bean("a", "b", "c");
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper
                .writer()
                .withView(View2.class)
                .writeValueAsString(bean));

    }

}
 

Вывод:

 {"field2":"b","field3":"c"}
 

Чтобы заставить его работать в JAX-RS, вы должны включить конкретное представление, аннотируя свои ресурсы метода HTTP, как описано здесь . Пример:

 @GET
@JsonView(View1.class)
public Bean doGet() {...}

@POST
@JsonView(View2.class)
public void doPost(Bean bean) {...}
 

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

1. Спасибо за ваш ответ. У нас должна быть практика повторного использования Objectmapper wiki.fasterxml.com /. … Готовлю клиентскую библиотеку. Так что это самое простое и оптимистичное.