我正在使用Jackson和Spring MVC将一些简单的对象以JSON格式输出。其中一个对象有一个名为“amount”的属性,类型为Double。(我知道Double不应该用作货币金额,但这不是我的代码。)
在JSON输出中,我想将金额限制为2位小数。目前显示为:
在JSON输出中,我想将金额限制为2位小数。目前显示为:
"amount":459.99999999999994
我尝试使用Spring 3的@NumberFormat
注解,但在这方面没有成功。看起来其他人也遇到了问题:MappingJacksonHttpMessageConverter的ObjectMapper在将JSON绑定到JavaBean属性时不使用ConversionService。
此外,我尝试使用@JsonSerialize
注解,并使用自定义序列化器。
在模型中:
@JsonSerialize(using = CustomDoubleSerializer.class)
public Double getAmount()
下面是序列化器(serializer)的实现代码:
public class CustomDoubleSerializer extends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
if (null == value) {
//write the word 'null' if there's no value available
jgen.writeNull();
} else {
final String pattern = ".##";
//final String pattern = "###,###,##0.00";
final DecimalFormat myFormatter = new DecimalFormat(pattern);
final String output = myFormatter.format(value);
jgen.writeNumber(output);
}
}
}
CustomDoubleSerializer
"似乎"可以工作。不过,有没有人能建议其他更简单(或更标准)的方法来实现这个功能。
getAmount()
将返回2位小数。不确定是否符合您的要求。如果其他人期望字段的精度,则此实现可能会产生副作用。 - devanggetAmountPrecise()
和getAmountRounded()
,并且只序列化后者。 - millimooseprivate static final DecimalFormat formatter = new DecimalFormat(".##");
来提高性能,然后引用字段formatter
,因为它始终是相同的? - randers@JsonFormat(shape = JsonFormat.Shape.NUMBER_FLOAT, pattern=...)
吗?但我认为你的方法是标准的。 - WesternGun