场景:
在实体类数据返回时,对于BigDecimal类型的数据,页面接口返回是默认去除小数点位后的无效0,当需要保留两位小数时,可以使用序列化对BigDecimal类型序列化为json格式的字符串展示。
@JsonSerialize(using = CustomBigDecimalSerializer.class)
public class RawmatWeighing extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id
@GeneratedValue(generator = "JDBC")
@Column(name = "rawmat_weighing_id")
private Long rawmatWeighingId;
/**
* 供方净重
*/
@Column(name = "supplier_net_weight")
@JsonSerialize(using = CustomBigDecimalSerializer.class)
private BigDecimal supplierNetWeight;
/**
* 毛重
*/
@Column(name = "gross_weight")
@JsonSerialize(using = CustomBigDecimalSerializer.class)
private BigDecimal grossWeight;
}
public class CustomBigDecimalSerializer extends JsonSerializer<BigDecimal> {
@Override
public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//默认保留小数点后两位
jsonGenerator.writeString(bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
}
}
返回为字符串类型:
总结:
CustomBigDecimalSerializer
类扩展了 Jackson 的 JsonSerializer<BigDecimal>
,并重写了 serialize
方法。在这个方法中,BigDecimal
类型的值被格式化为保留小数点后两位的字符串,并写入到 JSON 中。
因此,当使用 Jackson 将包含 grossWeight
属性的对象序列化为 JSON 时,grossWeight
字段在 JSON 中的表示将是一个字符串(String
类型),该字符串是 BigDecimal
值格式化后的结果,保留小数点后两位。
例如,如果 grossWeight
的值是 123.456
,那么序列化后的 JSON 中 grossWeight
字段的值将是 "123.46"
(注意,这里使用了四舍五入到小数点后两位)。
总结来说,虽然 grossWeight
字段在 Java 实体类中是一个 BigDecimal
类型的属性,但在序列化为 JSON 后,它将以字符串的形式表示,且该字符串是 BigDecimal
值格式化后的结果。