【问题标题】:Jackson annotation to convert BigDecimal value and set scale to 2杰克逊注释转换 BigDecimal 值并将比例设置为 2
【发布时间】:2019-05-30 17:42:26
【问题描述】:

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

public class Foo implements Serializable {

   private BigDecimal amount;
}

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

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

【问题讨论】:

    标签: java jackson deserialization bigdecimal json-deserialization


    【解决方案1】:

    当您想要设置比例时,您需要注意四舍五入。您有一些选项,例如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}
    

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      相关资源
      最近更新 更多