注明:本文摘自来源于其他博客
后端把Long类型的数据序列化成JSON后传给前端,前端可能会出现精度丢失的情况。
例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440
解决方法:
方法一:在后台将这个Long类型的字段转换成String类型的,风险比较大。
方法二:使用fastjson的提供的注解,@JSONField(serializeUsing = ToStringSerializer.class)。
需要导入包:
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;
@JSONField(serializeUsing = ToStringSerializer.class)private Long id;
备注:
fastjson在com.alibaba.fastjson.serializer包下面提供了多种数据类型转换的注解。
自己也可以拓展这些注解,通过实现ObjectSerializer接口来完成。
ToStringSerializer的代码:
public classToStringSerializer implements ObjectSerializer {public static final ToStringSerializer instance = newToStringSerializer();
@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,intfeatures) throws IOException {
SerializeWriterout = serializer.out;if (object == null) {out.writeNull();return;
}
String strVal= object.toString();out.writeString(strVal);
}
}
@Configurationpublic classSessionConfig implements WebMvcConfigurer{
@Overridepublic void configureMessageConverters(List>converters) {
FastJsonHttpMessageConverter fastJsonConverter= newFastJsonHttpMessageConverter();
FastJsonConfig fjc= newFastJsonConfig();/**
* 序列换成json时,将所有的long变成string
* 因为js中得数字类型不能包含所有的java long值*/SerializeConfig serializeConfig=SerializeConfig.globalInstance;
serializeConfig.put(Long.class, ToStringSerializer.instance);
serializeConfig.put(Long.TYPE , ToStringSerializer.instance);
fjc.setSerializeConfig(serializeConfig);
fastJsonConverter.setFastJsonConfig(fjc);
converters.add(fastJsonConverter);
}
}
@ResponseBody用fastjson输出fastjson将long转为String输出
js遇到long过长,精度损失,所以改为使用string来传输,但是将long字段改成String的代价太大了,所以直接让fastjson吧long转换成了String
但是@ResponseBody 返回的是Jackson来序列化的,所以要让spring的消息转换器换成fastjson
maven 添加配置:
com.alibaba
fastjson
1.2.45
1. 配置@ResponseBody使用fastjson
text/html;charset=UTF-8
application/json
application/xml;charset=UTF-8
WriteMapNullValue
WriteNullNumberAsZero
WriteNullListAsEmpty
WriteNullStringAsEmpty
WriteNullBooleanAsFalse
WriteDateUseDateFormat
2. Long转String
import java.io.IOException;
import java.lang.reflect.Type;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;public classLongToStringSerializer implements ObjectSerializer {public static final LongToStringSerializer instance = newLongToStringSerializer();
@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, intfeatures)
throws IOException {
SerializeWriterout = serializer.out;if (object == null) {out.writeNull();return;
}
String strVal= object.toString();out.writeString(strVal);
}
}