如何在JSON中显示尾随零的BigDecimal数字(而不是字符串)?

时间:2018-02-07 11:26:14

标签: java json jackson

在我的表示响应中,我有一个BigDecimal类型的字段。 它的值是2.30,但json响应显示为2.3 有没有办法显示尾随零,而不显示为字符串? 顺便说一句 - 我正在使用杰克逊图书馆。

{
  "version" : 2.3 (needs to be 2.30)
}

2 个答案:

答案 0 :(得分:3)

如果你想让JSON保持一个数值,你就没有选择权,数字不会受到traling" 0"的影响。在小数部分,所以他们不会被使用。仅仅因为:

2.3 = 2.30
2.3 = 2.300000

零被忽略。如果你真的需要得到像2.30这样的值,你有两个选择,

  1. 使用String在JSON中保存格式化号码
  2. 格式化客户端的值。
  3. 两种解决方案都使用相同的逻辑:

    String.format("%.2f", 2.3); //String: 2.30
    

    区别在于您格式化值的时刻。

    注意:

    因为你有一个"版本"字段,我会使用String,因为版本由.分隔的数值表示。看杰克逊的maven回购:

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.4</version>
    </dependency>
    

    2.9.4 不是数字。

答案 1 :(得分:1)

正如其他人指出的那样,由于JSON中的数字类型旨在作为纯值,因此在这种情况下,您实际上应该传递字符串以保留格式。

但是,如果您确实需要执行此操作(在Jackson生成的JSON中的数字类型上输出尾随零),这就是您的操作方式:

创建一个自定义序列化器类,如下所示:

final class PaddedSerializer extends JsonSerializer<BigDecimal> {
      @Override
      public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) 
        throws IOException, JsonProcessingException {
          jgen.writeRawValue(value.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
      }
    }

然后在绑定类中与所讨论的值相对应的变量上,放置@JsonSerialize批注以告诉它仅在该变量上使用自定义序列化器类:

@JsonProperty(required = true)
@JsonSerialize(using = PaddedSerializer.class)
protected BigDecimal version;