背景:因Long
类型传输到前端后,JavaScript
处理会丢失精度,需转成String
字符串类型。而fastjson注解只提供单个转换的注解,没有List整体转换的注解。
解决思路:使用自定义转换器进行转换。
实现方法:
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class LongListToStringListSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer jsonSerializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
SerializeWriter out = jsonSerializer.out;
if(object == null){
out.writeNull();
return;
}
List<Long> longList = (List<Long>) object;
List<String> stringList = longList.stream().map(Objects::toString).collect(Collectors.toList());
out.write(stringList);
}
}
使用方式:
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class Library {
@ApiModelProperty(value = "图书馆ID")
@JSONField(serializeUsing = ToStringSerializer.class)
private Long libraryId;
@ApiModelProperty(value = "图书ID")
@JSONField(serializeUsing = LongListToStringListSerializer.class)
private List<Long> bookIds;
}