在我的表示响应中,我有一个BigDecimal类型的字段。 它的值是2.30,但json响应显示为2.3 有没有办法显示尾随零,而不显示为字符串? 顺便说一句 - 我正在使用杰克逊图书馆。
{
"version" : 2.3 (needs to be 2.30)
}
答案 0 :(得分:3)
如果你想让JSON保持一个数值,你就没有选择权,数字不会受到traling" 0"的影响。在小数部分,所以他们不会被使用。仅仅因为:
2.3 = 2.30
2.3 = 2.300000
零被忽略。如果你真的需要得到像2.30这样的值,你有两个选择,
String
在JSON中保存格式化号码两种解决方案都使用相同的逻辑:
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;