js超过16位数字会损失精度的问题

在项目中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中的字段上

内容主要参考这个网页

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值