Кастомная Jackson десериализация/сериализация

Кастомная 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());
        }
    }
}
(Просмотрено 478 раз, 1 раз за сегодня)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *