方式一:使用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();
}
}
}