Java 到 Jackson JSON 序列化:货币字段

2022-08-31 15:16:17

目前,我正在使用Jackson从基于Spring的Web应用程序发送JSON结果。

我遇到的问题是试图让所有货币字段以2位小数输出。我无法使用解决这个问题,因为像25.50这样的数字被截断为25.5等setScale(2)

还有其他人处理过这个问题吗?我正在考虑用自定义的Jackson序列化器制作一个Money类......是否可以为字段变量创建自定义序列化程序?你也许可以...但即便如此,我怎样才能让我的客户序列化程序将数字添加为具有2位小数的数字?


答案 1

您可以在货币字段中使用自定义序列化程序。下面是一个MoneyBean的例子。字段数量使用 @JsonSerialize(using=...) 进行注释。

public class MoneyBean {
    //...

    @JsonProperty("amountOfMoney")
    @JsonSerialize(using = MoneySerializer.class)
    private BigDecimal amount;

    //getters/setters...
}

public class MoneySerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
            JsonProcessingException {
        // put your desired money style here
        jgen.writeString(value.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
    }
}

就是这样。大十进制现在以正确的方式打印。我用了一个简单的测试用例来展示它:

@Test
public void jsonSerializationTest() throws Exception {
     MoneyBean m = new MoneyBean();
     m.setAmount(new BigDecimal("20.3"));

     ObjectMapper mapper = new ObjectMapper();
     assertEquals("{\"amountOfMoney\":\"20.30\"}", mapper.writeValueAsString(m));
}

答案 2

您可以在变量上使用 as 注释。请参阅以下内容:@JsonFormatshapeSTRINGBigDecimal

 import com.fasterxml.jackson.annotation.JsonFormat;

  class YourObjectClass {

      @JsonFormat(shape=JsonFormat.Shape.STRING)
      private BigDecimal yourVariable;

 }