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

标签 java jackson deserialization bigdecimal json-deserialization

我有 POJO 就像我有一个 BigDecimal 字段:

public class Foo implements Serializable {

   private BigDecimal amount;
}

我希望 BigDecimal 值最多为 2 小数位。是否存在任何注释,我可以使用它直接在字段级别本身更改它的值?我也无法更改它的类型。

尽管可以在应用程序中使用 getter 和 ObjectMapper 来完成。

最佳答案

当你想设置比例时,你需要注意舍入。您有一些选项,例如 ROUND_HALF_EVEN并且您需要决定使用哪种舍入模式。

要拦截 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}

关于java - Jackson注释转换BigDecimal值并将比例设置为2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56383123/

相关文章:

java - 尝试使用 Jersey 中的 Pojo 对象处理 JSON 和 FORM 帖子

java - 为什么 Predicates.instanceOf 返回 false?

c# - 使用自定义 ContractResolver 将 JSON.NET 反序列化属性名称转换为 ExpandoObject

c# - 使用自定义转换器从流中反序列化 Json

java - Gson自定义反序列化但只有一个字段

java - Eclipse Intellisense 操作

java - 如何通过 Java 将标记添加到 XML 的序言

java - Jackson:获取反序列化的空引用

java - 从字节码中抓取java类名的函数

java - jackson.databind 没有这样的方法错误