【问题标题】:Format a float as fixed point with Jackson使用杰克逊将浮点数格式化为定点
【发布时间】:2019-01-29 14:11:54
【问题描述】:
我搜索了 Jackson 文档,但找不到任何关于浮点数的 pattern 或 @JsonFormat 的好的文档。
给定一个字段
@JsonProperty("Cost")
private Double cost;
如何让 Jackson 使用 @JsonFormat 将其格式化为具有四位精度的十进制格式的定点数?
PS:我知道不应该用花车来赚钱。请不要再讨论了。
【问题讨论】:
标签:
java
floating-point
jackson
number-formatting
【解决方案1】:
您可以在自定义序列化程序类中指定自己的格式化程序。
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】:
基于我正在使用的@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 格式,想要一个“。”作为小数分隔符。
【解决方案3】:
您需要为此创建一个自定义序列化程序。类似的东西
@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决定
但是对于杰克逊,我相信它只适用于日期。