小太阳的博客

Long类型丢失精度

方式一:使用jackson提供的注解

@Data
public class UserVO implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;

    //表示像前端返回数据时转为String,而前端传给后端无需处理,因为前端传入的是个String,后端接收时会转为Long
    @JsonSerialize(using = ToStringSerializer.class)
    @NotNull(message = "用户ID不能为空", groups = {Update.class})
    private Long userId;
}

方式二:自定义处理(更灵活)

接收前端Long类型参数

//将接收的前端字符串类型转换成Long类型
public class LongJsonDeserializer extends JsonDeserializer<Long> {
    @Override
    public Long deserialize(JsonParser jsonParser,
                            DeserializationContext deserializationContext) throws IOException {
        String value = jsonParser.getText();
        return StringUtils.isBlank(value) ? null : Long.parseLong(value);
    }
}

返回Long类型数据给前端

//向前端返回时将Long转成字符串
public class LongJsonSerializer extends JsonSerializer<Long> {
    @Override
    public void serialize(Long value, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException{
        String text = (value == null ? null : String.valueOf(value));
        if (text != null) {
            jsonGenerator.writeString(text);
        }
    }
}

在返回的字段上添加注解

  • @JsonDeserialize:反序列化使用。比如接收前端的数据转为实体
  • @JsonSerialize:序列化使用。比如返回数据到前端
@JsonDeserialize(using = LongJsonDeserializer.class)
@JsonSerialize(using = LongJsonSerializer.class)
private Long id;

返回集合且泛型为Long类型的处理

如返回List<Long>、Set<Long>时,以上的方法则不能满足,也需要自定义处理。

使用方式一样:@JsonSerialize(using = LongArrJsonSerializer.class)

/**
 * 返回数据时,对Long类型的集合转换成String后再返回,防止Long类型精度丢失
 */
public class LongArrJsonSerializer extends JsonSerializer<Collection<Long>> {

    @Override
    public void serialize(Collection<Long> values, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (CollectionUtil.isNotEmpty(values)) {
            String [] strArr = values.stream().map(l -> Long.toString(l)).toArray(String[]::new);
            jsonGenerator.writeArray(strArr, 0, strArr.length);
        } else {
            jsonGenerator.writeNull();
        }
    }

}

Copyright © 2023,版权所有 - 小太阳的博客 - 黑ICP备2023000004号