Skip to content

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();
        }
    }
 
}