Кастомная Jackson десериализация/сериализация
Допустим, имеем такую DTO:
@Data @NoArgsConstructor @AllArgsConstructor public class PowerOfAttorneyDto { @JsonDeserialize (using = ProductDtoDeserializer. class ) private Set<ProductDto> products = new HashSet<>(); } |
А нам нужно десериализовать из такого json:
{ "products" : [ product1_id, product2_id ] } |
То используем над полем аннотацию @JsonDeserialize(using = ProductDtoDeserializer.class) и делаем десериализатор
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; import java.util.HashSet; import java.util.Set; public class ProductDtoDeserializer extends StdDeserializer<Set<ProductDto>> { private static final long serialVersionUID = 1L; public ProductDtoDeserializer() { this ( null ); } public ProductDtoDeserializer(Class<Set<ProductDto>> t) { super (t); } @Override public Set<ProductDto> deserialize(JsonParser jp, DeserializationContext context) throws IOException, JsonProcessingException { Set<ProductDto> result = new HashSet<>(); JsonNode node = jp.getCodec().readTree(jp); node.forEach(jsonNode -> result.add( new ProductDto(jsonNode.asLong(), null ))); return result; } } |
А теперь сделаем так, чтобы строковое поле сериализовывалось в UpperCase
@Data public class CurrentAccountDto { @JsonSerialize (using = UppercaseStringSerializer. class ) private String status; } |
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; public class UppercaseStringSerializer extends StdSerializer<String> { public UppercaseStringSerializer() { super (String. class ); } @Override public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException { if (value == null ) { jgen.writeNull(); } else { jgen.writeString(value.toUpperCase()); } } } |
(Просмотрено 595 раз, 1 раз за сегодня)