首页 > 解决方案 > Spring序列化的双数格式

问题描述

我正在使用 Spring Boot 和 spring-web 并具有以下 dto:

public class InstructionDto {


    private Long id;
    private String scanningStatus;
    private LocalDate dateSubmitted;
    private InstructionTypeDto type;
    private InstructionStatus status;
    @DecimalMax(value = "1000000000.0", message = "Amount must be less than 1000000000")
    private Double amount;
    private String description;
    private Currency currency;
    private LocalDate actionByDate;
    private LocalDate dateResolved;
    private LocalDate cancellationDate;
}

带有类型amount的字段Double

每当我尝试获得amount> 10000000 的指令资源时,我都会得到类似的信息:

{
  "id": 31,
  "scanningStatus": "",
  "dateSubmitted": "2020-08-17",
  "type": {
    "id": 1,
    "name": "New Type"
  },
  "status": "SENT",
  "amount": 1.0E8,
  "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean at tortor sit amet est finibus tempus. Vivamus dictum, quam in egestas mollis, nibh libero bibendum lorem, non malesuada enim risus ac risus. Fusce sed mi quis risus semper orci aliquam",
  "currency": "USD",
  "actionByDate": "2020-08-31",
  "dateResolved": null,
  "cancellationDate": null,
}

所以amount= 1.0E8,但是,我更喜欢amount= 10000000

是否有可能以某种方式以适当的格式对其进行序列化?

谢谢

标签: spring-bootspring-mvc

解决方案


解决方案是编写自定义序列化程序:

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

然后将其应用于所需的字段:

public class InstructionDto {
    ...
    @DecimalMax(value = "1000000000.0", message = "Amount must be less than 1000000000")
    @JsonSerialize(using = DecimalJsonSerializer.class)
    private Double amount;
    ...
}

推荐阅读