java的long类型转为json格式后,js中精度丢失问题

转载 2017年12月12日 09:59:27

java的long类型转为json格式后,js中精度丢失问题

环境:

使用spring mvc 配置json消息转换器为MappingJackson2HttpMessageConverter

发现long类型的数据到了js端会丢失精度

解决方案:

将long统一转为string类型

方法一:

数据层转换,由于项目使用了spring 的jdbc模版类,查询时调用了spring的query方法

    public <T> List<T> query(String sql, SqlParameterSource paramSource, RowMapper<T> rowMapper)
            throws DataAccessException {

        return getJdbcOperations().query(getPreparedStatementCreator(sql, paramSource), rowMapper);
    }

这个方法有个参数rowMapper,我用来将数据库数据转换为Map,我通过自定义实现RowMapper接口,将mysql数据库里的bigint类型转为string而不是默认的long,代码如下:

复制代码
public class HashMapRowMapper implements RowMapper<Map<String, Object>> {

    @Override
    public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
        ResultSetMetaData rsmd = rs.getMetaData();
        int columnCount = rsmd.getColumnCount();
        Map<String, Object> mapOfColValues = new LinkedCaseInsensitiveMap<Object>(columnCount);
        for (int i = 1; i <= columnCount; i++) {
            String key = JdbcUtils.lookupColumnName(rsmd, i);
            Object obj = JdbcUtils.getResultSetValue(rs, i);
            if (obj == null) {
                mapOfColValues.put(key, obj);
            }
            if (obj != null) {
                Class<?> cc = obj.getClass();
                if (cc.getName().equals("java.math.BigInteger") && obj != null) {
                    mapOfColValues.put(key, String.valueOf(obj));
                } else {
                    mapOfColValues.put(key, obj);
                }
            }
        }
        return mapOfColValues;
    }

}
复制代码

调用代码如下,注意query传入的最后一个参数使用了自定已类HashMapRowMapper:

复制代码
    public Map<String, Object> getItem(Map<String, Object> inParam) {
        if (MapUtil.getValue("id", inParam) == "")
            throw new InParamCheckException("id不能为空:" + inParam.get("id"));
        String orgId = MapUtil.getValue("org_id", inParam);
        String appId = IDConstants.APP_ID_PIS;
        NamedParameterJdbcTemplate jdbc = jdbcRouteHelper.getJDBCTemplate(orgId, appId);

        return new MyMap().put("simple_info", jdbc.query("select * from simple_info where id=:id", inParam, new HashMapRowMapper()))
                .put("simple_test",
                        jdbc.query("select * from simple_test where simple_info_id=:id", inParam, new HashMapRowMapper()))
                .getMap();
    }
复制代码

 

 

方法二:

配置spring的消息转换器的ObjectMapper为自定义的类

配置如下:

复制代码
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean
                    class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="objectMapper">
                        <bean class="LongToStringJsonConverter">
                            <property name="supportedMediaTypes">
                                <list>
                                    <value>application/json;charset=UTF-8</value>
                                    <value>text/html;charset=UTF-8</value>
                                    <value>text/plain;charset=UTF-8</value>
                                </list>
                            </property>
                            <property name="dateFormat">
                                <bean class="java.text.SimpleDateFormat">
                                    <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
                                </bean>
                            </property>
                        </bean>
                    </property>
                </bean>
    </bean>
复制代码

其中LongToStringJsonConverter为自定义转换器

复制代码
public class LongToStringJsonConverter extends ObjectMapper {
    /**
     * 
     */
    private static final long serialVersionUID = 1683531771040674386L;

    @Override
    public ObjectMapper registerModule(Module module) {
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        return super.registerModule(simpleModule);
    }
}
复制代码

spring中controller层的代码使用时无需特别修改,下面是一个controller类里返回json数据,代码不做任何修改,long类型已经转为string返回到web浏览器了.

复制代码
    @RequestMapping("/")
    @ResponseBody
    public Map<String, Object> init() {
        List<Object> lstDoctor = dictConsumer.getBaseParam().getItemsFromCache(cache_keys.PIS_doctor.name(),
                test_org_id, IDConstants.APP_ID_PIS);
        List<Object> lstSubjectType = dictConsumer.getBaseParam().getItemsFromCache(cache_keys.PIS_subject_type.name(),
                test_org_id, IDConstants.APP_ID_PIS);
        List<Object> lstTest = dictConsumer.getBaseParam().getItemsFromCache(cache_keys.PIS_test.name(),
                test_org_id, IDConstants.APP_ID_PIS);        
        MyMap map = new MyMap();
        map.put("doctors", lstDoctor).put("subject_types", lstSubjectType).put("tests", lstTest);
        return map.getMap();

    }
复制代码

 

java Long类型转为json后数据损失精度

最近在项目开发中,使用spring boot  +mybatis的架构,数据库设计主键id时定义为bigint类型,使用mybatis的自动生成代码后没注意,主键在pojo里的类型为Long。 查询时...
  • xiaoxiangzi520
  • xiaoxiangzi520
  • 2017年08月01日 13:43
  • 1803

Flaot 转 Json 精度丢失

楼主在项目中 float 类型转成json数组时,发现小数点后突然多出来4、5位数,开始以为时数据库精度问题,后来发现时json转化时出现精度丢失 看了上面的测试,确实是这个问题,但没有采用以上的方...
  • htopen123
  • htopen123
  • 2016年06月30日 10:14
  • 3059

FastJson与Gson转换成json串丢失精度问题

转载请注明出处:大家好,最近在项目开发过程中碰到一个比较坑的问题,导致与后台服务器联调花了比较多的时间,所以在这里记录一下这个坑,如果有人碰到了,也可以提供了一个比较好的参考方法。问题如下:我的jav...
  • woshizisezise
  • woshizisezise
  • 2016年08月22日 14:18
  • 1952

Android/java的long类型时间戳,转换成时间格式工具类

  • 2017年04月18日 09:47
  • 1KB
  • 下载

long long类型转double类型部分精度丢失问题

我最近做了一道题,一个64位(unsigned __int64)范围内的数输出其除以1000的值,并按四舍五入保留小数点后三位。 我刚开始直接写WA,结果发现当数比较大的时候,结果后几位精度总会丢失,...
  • dzz0119
  • dzz0119
  • 2015年08月11日 17:56
  • 3996

使用js将long类型转化为"yyyy-MM-dd hh:mm:ss"日期格式&jQuery自带日历控件的汉化教程

使用js将long类型转化为"yyyy-MM-dd hh:mm:ss"日期格式&jQuery自带日历控件的汉化教程...
  • leixingbang1989
  • leixingbang1989
  • 2015年12月28日 10:17
  • 3381

Java Float类型 减法运算时精度丢失问题

转载地址子:http://www.blogjava.net/jelver/articles/340038.html 原文: package test1; public cla...
  • fancylovejava
  • fancylovejava
  • 2013年09月25日 19:44
  • 8459

Java Float类型 减法运算时精度丢失问题

package test1; public class Test2 { /** * @param args */ public static void main(String[] a...
  • Clover_tjp
  • Clover_tjp
  • 2013年11月08日 13:35
  • 480

Java中double类型精度丢失问题

Java中double 类型精度丢失问题
  • u014306011
  • u014306011
  • 2016年05月10日 23:11
  • 4835

java中Double类型的运算精度丢失的问题

在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我...
  • XingKong22star
  • XingKong22star
  • 2014年08月08日 10:19
  • 659
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java的long类型转为json格式后,js中精度丢失问题
举报原因:
原因补充:

(最多只允许输入30个字)