用杰克逊将浮点格式设置为固定点

时间:2018-08-23 08:46:54

标签: java floating-point jackson number-formatting

我已经搜索了Jackson的文档,但是找不到pattern@JsonFormat的任何好的文档来获取浮点数。

给出一个字段

@JsonProperty("Cost")
private Double cost;

我如何让Jackson用@JsonFormat以十进制格式将其格式化为四位数精度的定点数?

PS:我知道不应以花车赚钱。请为我们提供讨论。

3 个答案:

答案 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格式,而是想要一个“。”作为小数点分隔符。