Java 如何在JSON中显示尾随零的BigDecimal数字(不是字符串)?

Java 如何在JSON中显示尾随零的BigDecimal数字(不是字符串)?,java,json,jackson,Java,Json,Jackson,在我的表示响应中,有一个字段是BigDecimal类型的。 其值为2.30,但json响应显示为2.3 有没有办法也显示尾随的零,而不显示为字符串? 顺便说一句,我正在使用杰克逊图书馆 { "version" : 2.3 (needs to be 2.30) } 如果您想让JSON保持一个数值,您没有选择权,一个数值不会受到小数部分中的traling“0”的影响,因此它们不会被使用。原因很简单: 2.3 = 2.30 2.3 = 2.300000 零被忽略。如果你真的需要得到2.30这样

在我的表示响应中,有一个字段是BigDecimal类型的。 其值为2.30,但json响应显示为2.3 有没有办法也显示尾随的零,而不显示为字符串? 顺便说一句,我正在使用杰克逊图书馆

{
  "version" : 2.3 (needs to be 2.30)
}

如果您想让JSON保持一个数值,您没有选择权,一个数值不会受到小数部分中的traling“0”的影响,因此它们不会被使用。原因很简单:

2.3 = 2.30
2.3 = 2.300000
零被忽略。如果你真的需要得到2.30这样的值,你有两个选择

  • 使用
    字符串
    保存JSON中的格式的数字
  • 在客户端设置值的格式
  • 两种解决方案将使用相同的逻辑:

    String.format("%.2f", 2.3); //String: 2.30
    
    差异在于格式化值的时刻

    注: 因为您有一个“version”字段,所以我将使用
    字符串
    ,因为版本由
    分隔的数值表示。参见杰克逊的maven回购协议:

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.4</version>
    </dependency>
    
    
    com.fasterxml.jackson.core
    杰克逊核心
    2.9.4
    

    2.9.4不是数字。

    正如其他人所指出的,在本例中,您应该传递一个字符串以保留格式,因为JSON中的数字类型是纯值

    但是,如果您确实需要这样做(Jackson生成的JSON中数字类型的输出尾随零),您可以这样做:

    创建自定义序列化程序类,如下所示:

    final class PaddedSerializer extends JsonSerializer<BigDecimal> {
          @Override
          public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) 
            throws IOException, JsonProcessingException {
              jgen.writeRawValue(value.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
          }
        }
    

    数字“2.3”和“2.30”之间没有区别,因为字符串是不同的,但数字不是。在这种情况下只能使用字符串。您可以在创建json之前将
    BigDecimal
    转换为
    String
    。版本不是数字。2.30是大调=:2,小调=30。所以这根本不是一个数值。一个简单的例子是,在大多数情况下,版本使用3个数字,由
    分隔,如1.2。3@AxelH-假设字段是另一个数字。如果你不在乎,小数点后的0.30或0.3是相等的,它仍然是3/10。但在本案中;3岁的小调与30岁的小调不同。如果要保持这样的格式,请使用
    字符串
    ,因为这是一个格式化的值。如果我将BigDecimal更改为Float/Double,我可以这样做吗?不,您甚至可以使用由
    2.22229
    表示的十进制
    2.3
    得到最差的结果,因为浮点“缺少”精度。问题只是来自使用数值而不是文本的JSON。注:如果您的客户不理解
    2.3
    2.30
    相同,那么您可能不理解他们的要求;)。我正在处理遗留代码。我不能违反合同。好吧@sharon,。使用第二种解决方案,您不必对JSON进行任何更改。您发送
    2.3
    ,客户端只需将值格式化为
    2.30
    。如果你真的想在JSON中使用它,我需要与Jackson联系以提供格式化程序。。。这在RFC中是允许的,所以这是可能的,在Jackson中不确定。。。您能提供一个快速构建JSON的方法吗?这对您来说更容易理解。您描述的解决方案仍然会删除尾随的零。这是无法避免的simpy json规范,由客户机/接收器以所需格式显示它。
    @JsonProperty(required = true)
    @JsonSerialize(using = PaddedSerializer.class)
    protected BigDecimal version;