需要Jackson序列化器用于Double,需要在运行时指定精度

sma*_*ers 7 java json serializer jackson

关于为数字,货币等创建Jackson序列化器的帖子很多.对于工程应用,通常需要根据单位或其他标准设置数字的精确度.

例如,空间坐标可能会被限制在小数点后的5或6位数,并且温度可能会被限制在小数点后的2位数.具有太多数字或截断指数表示法的默认序列化程序行为并不好.我需要的是:

@JsonSerialize(using=MyDoubleSerializer.class, precision=6) double myValue;
Run Code Online (Sandbox Code Playgroud)

并且更好地能够在运行时指定精度.我也在使用MixIn.我可以为每个类编写一个序列化程序,但希望指定具体的值.

任何想法,将不胜感激.

Jus*_*ose 16

您可以使用Jackson ContextualSerializer来实现所需的序列化,如下所示.

首先,创建一个注释来捕获精度

@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Precision {
    int precision();
}
Run Code Online (Sandbox Code Playgroud)

接下来,为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,注释您的字段以使用自定义序列化程序并设置精度

public class Bean{

   @JsonSerialize(using = DoubleContextualSerializer .class)
   @Precision(precision = 2)
   private double doubleNumber;

}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!!