我编写了一个自定义JsonSerializer,将BigDecimal转换为String。我想使用@JsonSerialize注释来调用此序列化程序,但有条件地,即,如果特定的布尔值仅是true,则应执行从BigDecimal到String的转换。

我有一个具有BigDecimal价格字段的POJO。发送此P​​OJO是为了响应两个剩余调用:


期望价格字段为数值// // @ JsonSerialize应该
不跑
期望价格字段为字符串值/// @ JsonSerialize
应该跑


谁能建议我该如何实现?

以下是我编写的自定义序列化程序的代码段:

public class BigDecimalToStringSerializer extends JsonSerializer<BigDecimal> {

    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException,
        JsonProcessingException {
        gen.writeString(value.toString());
    }

}


具有价格字段的POJO文件:

JsonInclude(Include.NON_NULL)
public class Price{
    private BigDecimal price;
    public Price() {
    }
    @JsonSerialize(using = BigDecimalToStringSerializer.class)
    public BigDecimal getPrice() {
        return price;
    }
    public void setPrice(BigDecimal pric) {
        this.price  = price;
    }
}


提前感谢一吨!

最佳答案

您可以为此实现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);

10-04 23:29