Вы можете реализовать PropertyFilter
для этого. Во-первых, вам необходимо определить фильтр для нашей сущности, используя аннотацию @JsonFilter
:
@JsonFilter("stringValueFilter")
public class Price {
private BigDecimal price;
public Price() {
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal pric) {
this.price = price;
}
}
Это ваш PropertyFilter
public interface PropertyFilter {
void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider prov, PropertyWriter writer);
void serializeAsElement(Object elementValue, JsonGenerator jgen, SerializerProvider prov, PropertyWriter writer) throws Exception;
void depositSchemaProperty(PropertyWriter writer, JsonObjectFormatVisitor objectVisitor, SerializerProvider provider) throws JsonMappingException;
@Deprecated
void depositSchemaProperty(PropertyWriter writer, ObjectNode propertiesNode, SerializerProvider provider) throws JsonMappingException;
}
Первый метод требует специальной реализации для вашего случая:
public class StringValueFilter implements PropertyFilter {
void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider prov, PropertyWriter writer) {
if (pojo instanceof Price && isValueFieldNumber((Price) pojo)) {
return; // skip this field
}
writer.serializeAsField(pojo, jgen, prov);
}
private isValueFieldNumber(Price price) {
return: //check your logic and return
}
void serializeAsElement(Object elementValue, JsonGenerator jgen, SerializerProvider prov, PropertyWriter writer) throws Exception {
writer.serializeAsField(elementValue, jgen, prov);
}
void depositSchemaProperty(PropertyWriter writer, JsonObjectFormatVisitor objectVisitor, SerializerProvider provider) throws JsonMappingException {
writer.depositSchemaProperty(objectVisitor);
}
@Deprecated
void depositSchemaProperty(PropertyWriter writer, ObjectNode propertiesNode, SerializerProvider provider) throws JsonMappingException {
writer.depositSchemaProperty(propertiesNode, provider);
}
}
Этот фильтр содержит фактическую логику, решающую, будет ли поле price
сериализовано или нет, в зависимости от его значения.
Далее вам нужно подключить этот фильтр к ObjectMapper
:
final ObjectMapper mapper = new ObjectMapper();
final FilterProvider filterProvider = new SimpleFilterProvider()
.addFilter("stringValueFilter", new StringValueFilter());
mapper.setFilters(filterProvider);