最近公司有个新项目,一开始主键是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); }
js 对 long 精度的丢失是个麻烦事,这个方案十分简洁