#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 /. … Готовлю клиентскую библиотеку. Так что это самое простое и оптимистичное.