您可以使用Jackson的ContextualSerializer
來實現所需的序列化,如下所示。
首先,創建註釋來捕獲精度
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Precision {
int precision();
}
接下來,創建用於Double
類型的查找Precision
註釋場上被序列化,然後創建爲指定的精確度的新串行上下文串行器。
public class DoubleContextualSerializer extends JsonSerializer<Double> implements ContextualSerializer {
private int precision = 0;
public DoubleContextualSerializer (int precision) {
this.precision = precision;
}
public DoubleContextualSerializer() {
}
@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
if (precision == 0) {
gen.writeNumber(value.doubleValue());
} else {
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(precision, RoundingMode.HALF_UP);
gen.writeNumber(bd.doubleValue());
}
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
Precision precision = property.getAnnotation(Precision.class);
if (precision != null) {
return new DoubleContextualSerializer (precision.precision());
}
return this;
}
}
最後,你的註釋字段中使用自定義序列化和集精密
public class Bean{
@JsonSerialize(using = DoubleContextualSerializer .class)
@Precision(precision = 2)
private double doubleNumber;
}
希望這有助於!
這幾乎可行。順便說一句,你有一個錯字「Serilaizer」。我現在面臨的問題是我正在使用MixIn,這樣我就不會用Jackson註釋污染POJO。 MixIn看起來像這樣:'@JsonSerialize(using = JacksonJsonDoubleSerializer.class)@FormatterPrecision(precision = 2)abstract Double getValue();'@ FormatterPrecision'在該位置不允許。 – smalers
這是因爲我已經通過'@Target({ElementType.FIELD)})'配置了僅用於字段級別的註釋。你可以配置方法,構造函數等。我已經編輯了答案,通過添加'ElementType.METHOD'來允許方法。 –
'ElementType.METHOD'建議工作。下面是我使用DecimalFormat而不是BigDecimal的解決方案,希望獲得良好的性能。 – smalers