我已经搜索了Jackson的文档,但是找不到pattern
中@JsonFormat
的任何好的文档来获取浮点数。
给出一个字段
@JsonProperty("Cost")
private Double cost;
我如何让Jackson用@JsonFormat
以十进制格式将其格式化为四位数精度的定点数?
PS:我知道不应以花车赚钱。请为我们提供讨论。
答案 0 :(得分:2)
您需要为此创建一个自定义的序列化器。像
@JsonProperty("amountOfMoney")
@JsonSerialize(using = MySerializer.class)
private Double cost;
public class MySerializerextends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator generator, SerializerProvider provider) throws IOException,
JsonProcessingException {
double roundedValue = value*10000;
roundedValue = Math.round(roundedValue );
roundedValue = roundedValue /10000;
generator.writeNumber(roundedValue );
}
}
您可以在此处查看有关课程的信息 https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind/JsonSerializer.html
舍入部分可能不是最好的。您可以根据自己的喜好进行操作;)也可以使用十进制格式。如果使用writeNumber,它将在结果Json中将值打印为数字。这就是为什么我将答案从writeString更改为十进制格式的原因。
如果实现允许,您应该能够使用@JsonFormat模式。
可以使用的特定于数据类型的其他配置 进一步完善格式化方面。例如,这可以确定 用于日期序列化的低级格式字符串;但是,确切的 使用情况由特定的JsonSerializer确定
但是对于杰克逊,我相信它仅适用于约会。
答案 1 :(得分:2)
您可以在自定义序列化程序类中指定自己的格式化程序。
formatter = new DecimalFormat();
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setGroupingUsed(false);
DecimalFormatSymbols sym = DecimalFormatSymbols.getInstance();
sym.setDecimalSeparator('.');
formatter.setDecimalFormatSymbols(sym);
然后,在实际的序列化方法中:
final String output = formatter.format(value);
jsonGenerator.writeNumber(output);
答案 2 :(得分:0)
以我正在使用的@Veselin的答案为基础
public class DoubleDecimalSerializerWithSixDigitPrecisionAndDotSeparator
extends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator generator, SerializerProvider serializers)
throws IOException {
generator.writeNumber(String.format(Locale.US, "%.6f", value));
}
}
用例是在德国生成CSV,因此我不在乎JSON格式,而是想要一个“。”作为小数点分隔符。