为什么 Jackson 序列化时省略了小数点为零的 Double?

ser*_*rah 1 java rest json jackson

我使用 jackson 和 spring 将 Java 序列化/反序列化为 JSON,反之亦然。

当 Jackson 将我的 Java 对象序列化为 JSON 时,十进制值为零的双精度值将被去除,而具有十进制值的双精度值将被考虑在内。例如:550.77 正确序列化为 550.77,而 440.00 则序列化为 4​​40(等于整数)。

如何确保保留以 .00 作为十进制值的双精度序列化?

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility =  Visibility.ANY, setterVisibility = Visibility.NONE)
public class Price extends DTO {

private static final long serialVersionUID = -3986616090347452845L;


private Double _exclVat;

private Double _inclVat;


public Price(){
    super();
}

public Price(Double pExclVat, Double pInclVat) {
    this();
    _exclVat = pExclVat;
    _inclVat = pInclVat;
}


public Double getExclVat() {
    return _exclVat;
}

public void setExclVat(Double pExclVat) {
    _exclVat = pExclVat;
}

public Double getInclVat() {
    return _inclVat;
}

public void setInclVat(Double pInclVat) {
    _inclVat = pInclVat;
}
}
Run Code Online (Sandbox Code Playgroud)

JSON格式

"price" : {
  "excl_vat" : 250.0,
  "incl_vat" : 208.33
}
Run Code Online (Sandbox Code Playgroud)

JSON 序列化时是否可以返回 250.00 而不是 250.0?

Bar*_*cki 5

如果您确实需要精确两位小数,您可以尝试编写自己的数字序列化器,例如

public class DecimalJsonSerializer extends JsonSerializer<Double> {
  @Override
  public void serialize(Double value, JsonGenerator jgen, SerializerProvider provider) 
    throws IOException, JsonProcessingException {
      jgen.writeString( String.format("%.2f", value));
  }
}
Run Code Online (Sandbox Code Playgroud)

然后用它来注释每个字段

@DecimalJsonSerializer(using=PriceJsonSerializer.class)
private Double _exclVat;

@DecimalJsonSerializer(using=PriceJsonSerializer.class)
private Double _inclVat;
Run Code Online (Sandbox Code Playgroud)

不需要定制解串器。默认解串器应该能够很好地处理以这种方式格式化的数字。