【问题标题】: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决定

        但是对于杰克逊,我相信它只适用于日期。

        【讨论】:

        • pattern 在这里没用?
        • 我相信杰克逊只用于日期。
        猜你喜欢
        • 2013-06-09
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 2014-12-30
        相关资源
        最近更新 更多