用于转换 BigDecimal 值并将比例设置为 2 的 Jackson 注释
Jackson annotation to convert BigDecimal value and set scale to 2
我有 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}
我有 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}