后端输出Long型数据过长前端精度丢失解决方案

最近公司有个新项目,一开始主键是uuid varchar,后来采用bigint,但是在调试时发现18位的Long型数据,在前端js解析时丢失了两位。

前提:使用JFinalJson解析器,很好用,不想替换为fastjson、Jackson

后端输出Long为字符串

后端输出Long为String处理方法:重写JFinalJsonFactory、JFinalJson,这里主要是改写JFinalJson中的toJson方法,增加

if(value instanceof Long)
  return "\"" + value.toString() + "\"";

     这样就解决了Long型输出为String

前端提交json中的String转为Long:

// 获取前端提交的json

Map<String, Object> map = JSON.parseObject(HttpKit.readData(getRequest()), Map.class);

// 转为model

  • User user = new User()._setAttrs(map);

// 重写._setAttrs方法,判断_setAttrs中的map参数是否为model数据,并验证数据类型是否为Long,是则进行转为String为Long

public M _setAttrs(Map<String, Object> attrs) {
  Map<String, Object> attrsNew = new HashMap<>();
  Table table = getTable();
  Class<?> clases = null;
  for (String key : attrs.keySet()) {
    clases = table.getColumnType(key);
    if(table.hasColumnLabel(key)){
      Object valueObject = attrs.get(key);
      if(Long.class.isAssignableFrom(clases) && valueObject != null) {
        String valueString = (String) valueObject;
        valueObject = Long.valueOf(valueString);
      }
      attrsNew.put(key, valueObject);
    }
  }
  return super._setAttrs(attrsNew);
}


评论区

JFinal

2019-05-06 16:34

惊现大神

js 对 long 精度的丢失是个麻烦事,这个方案十分简洁

逍遥一生

2019-05-22 11:42

这个好,以前也遇到这个问题,java到js的自己做了,js到java的没搞,学习了

nfsgreen

2021-12-12 16:14

大神

热门分享

扫码入社