Java to Jackson JSON序列化:Money字段

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

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

还有其他人处理过这个问题吗? 我正在考虑使用自定义的Jackson序列化程序创建Money类…您可以为字段变量创建自定义序列化程序吗? 你可能……但即使如此,我怎么能让我的客户序列化器将数字添加为2位小数的数字?

您可以在货币领域使用自定义序列化程序。 这是MoneyBean的一个例子。 字段数量使用@JsonSerialize注释(使用= …)

 public class MoneyBean { //... @JsonProperty("amountOfMoney") @JsonSerialize(using = MoneySerializer.class) private BigDecimal amount; //getters/setters... } public class MoneySerializer extends JsonSerializer { @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()); } } 

而已。 现在以正确的方式打印BigDecimal。 我使用一个简单的测试用例来显示它:

 @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)); } 

您可以配置使用特定类型的客户序列化程序的模块,而不是在每个成员或getter上设置@JsonSerialize:

 SimpleModule module = new SimpleModule(); module.addSerializer(BigInteger.class, new ToStringSerializer()); objectMapper.registerModule(module); 

在上面的例子中,我使用字符串序列化器来序列化BigIntegers(因为javascript无法处理这样的数值)。

我是jackson-datatype-money的维护者之一,所以我的答案很有道理,因为我当然有偏见。 该模块应该满足您的需求,并且它非常轻量级(没有额外的运行时依赖性)。 此外, jackson文档中提到了Spring文档 ,甚至还有一些关于如何将其整合到Jackson官方生态系统中的讨论。

我有同样的问题,我把它格式化为JSON作为字符串而不是。 可能有点黑客但它很容易实现。

 private BigDecimal myValue = new BigDecimal("25.50"); ... public String getMyValue() { return myValue.setScale(2, BigDecimal.ROUND_HALF_UP).toString(); } 

您可以在BigDecimal变量上使用shapeSTRING @JsonFormat注释。 参考下文:

  import com.fasterxml.jackson.annotation.JsonFormat; class YourObjectClass { @JsonFormat (shape=JsonFormat.Shape.STRING) private BigDecimal yourVariable; }