Long类型返回到前端丢失精度
方式一:使用jackson提供的注解
java
@Data
public class UserVO {
//表示这个字段向前端返回数据时转为String,而前端传给后端无需处理,因为前端传入的是个String,后端接收时会转为Long
@JsonSerialize(using = ToStringSerializer.class)
private Long userId;
}
方式二:自定义处理
新建反序列化处理类,后端接收前端Long类型参数
java
//将接收的前端字符串类型转换成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类型数据给前端时转为字符串
java
//向前端返回时将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);
}
}
}
在返回的字段上添加注解
java
@Data
public class UserVO {
//指定自定义处理类
@JsonDeserialize(using = LongJsonDeserializer.class) //反序列化
@JsonSerialize(using = LongJsonSerializer.class) //序列化
private Long userId;
}
返回集合且泛型为Long类型的处理
如返回List<Long>
、Set<Long>
时,以上的方法则不能满足,也需要自定义处理。 使用方式一样:@JsonSerialize(using = LongArrJsonSerializer.class)
java
/**
* 返回数据时,对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();
}
}
}