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)
希望这可以帮助!!