在项目中java使用Long类型来表示有18位数字的订单号,传到前端时由于js代码处理超过16位的数字时会损失精度,所以要在后台把数字转换成字符串再传输。
一开始我打算手动把bean转换成JSONArray,再遍历这个json数组取值,将数字转换成字符串,再将这个字符串设置回原来的位置,但是发现这样没有效果。
1、上网查发现可以这样
设置返回值序列化时使用alibaba的jastjson,不使用默认的Jackson
<mvc:annotation-driven>
<!-- 重新设置@RequestMapping中对@ResponseBody以String类型消息转换器的字符集 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
序列化类
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 class LongToStringSerializer implements ObjectSerializer {
public static final LongToStringSerializer instance = new LongToStringSerializer();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
String strVal = object.toString();
out.writeString(strVal);
}
}
使用标签
@JSONField(serializeUsing = LongToStringSerializer.class)
private long id;
**开始时以为是在controller的返回值中使用这个标签,没有效果,所以直接在包装类中增加多一个String字段来解决
现在看来这个标签应该是放在bean中的字段上