有很多关于为数字、货币等创建 Jackson 序列化程序的帖子。对于工程应用程序,通常需要根据单位或其他标准设置数字的精度。
例如,空间坐标可能限制在小数点后 5 或 6 位,温度可能限制在小数点后 2 位。具有太多数字或截断指数符号的默认序列化器行为不好。我需要的是这样的:
@JsonSerialize(using=MyDoubleSerializer.class, precision=6) double myValue;
并且更好的是能够在运行时指定精度。我也在使用 MixIn。我可以为每个类编写一个序列化程序,但希望指定特定的值。
任何想法将不胜感激。
最佳答案
您可以使用 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;
}
希望这有帮助!!
关于java - Double 需要 Jackson 序列化程序,并且需要在运行时指定精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44110624/