java - Double 需要 Jackson 序列化程序,并且需要在运行时指定精度

标签 java json jackson serialization

有很多关于为数字、货币等创建 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/

相关文章:

java - 无法执行 jar- 文件 : "no main manifest attribute"

java - 从 Java 检索在网页上动态呈现的 SVG

c# - 为什么 Json.Encode 不能正确编码从 Json.Decode 返回的数据?

javascript - 使用 javascript setTimeout 来查看 div 是否已加载

java - Spring MVC 中无法将有效的 JSON 数组作为请求正文

java - 在 JDeveloper 11g 中找不到 mySQL 驱动程序类

java - 如何在不使用静态的情况下将信息从一个类传输到另一个类以显示它?

javascript - 根据 html 选择值中的数据为 FullCalendar 提供 json feed url

java - 如何使用 Jackson 将自定义方法的输出序列化为 JSON?

java - 如何以编程方式配置 Jersey 以使用 Jackson 进行 JSON(反)序列化?