Java Jackson注释转换BigDecimal值并将比例设置为2

Java Jackson注释转换BigDecimal值并将比例设置为2,java,jackson,deserialization,bigdecimal,json-deserialization,Java,Jackson,Deserialization,Bigdecimal,Json Deserialization,我有POJO类似于我有一个BigDecimal字段: public class Foo implements Serializable { private BigDecimal amount; } 我只想将BigDecimal值设置为2小数位。是否存在可以直接在字段级别更改其值的注释?我也不能改变它的类型 虽然可以在应用程序中使用getter和ObjectMapper来完成此操作。如果要设置比例,则需要注意舍入。您有一些选项,如和,您需要决定使用哪种舍入模式 要截取BigDecimal

我有
POJO
类似于我有一个
BigDecimal
字段:

public class Foo implements Serializable {

   private BigDecimal amount;
}
我只想将
BigDecimal
值设置为
2
小数位。是否存在可以直接在字段级别更改其值的注释?我也不能改变它的类型


虽然可以在应用程序中使用getter和
ObjectMapper来完成此操作。

如果要设置比例,则需要注意舍入。您有一些选项,如和,您需要决定使用哪种舍入模式

要截取
BigDecimal
反序列化,您可以编写自定义反序列化程序。下面的示例演示了如何进行此操作,我们可以扩展默认值并在反序列化后设置比例:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();

        Foo person = mapper.readValue(jsonFile, Foo.class);
        System.out.println(person);
    }
}

class BigDecimal2JsonDeserializer extends NumberDeserializers.BigDecimalDeserializer {

    @Override
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        BigDecimal value = super.deserialize(p, ctxt);

        // set scale
        value = value.setScale(2, BigDecimal.ROUND_HALF_EVEN);

        return value;
    }
}

class Foo {

    @JsonDeserialize(using = BigDecimal2JsonDeserializer.class)
    private BigDecimal amount;

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    @Override
    public String toString() {
        return "Foo{" +
                "amount=" + amount +
                '}';
    }
}
对于以下
JSON
有效负载:

{
  "amount": 16.127
}
以上应用程序打印:

Foo{amount=16.13}