如题,最近接了一个新项目,全新开发,就使用了jdk21,客户那边有安全扫描,所以项目的依赖越少越好。JF + HuTool工具包 ,项目业务是够用了。其中json工具也从FastJson改到HuToolJson了,使用上,感觉HuToolJson的API设计和FastJson很像,所以使用起来无感,JF里面需要配置一下。性能上FastJson好于HuToolJson。但是如果字符串不大的情况的,差别也不是特别大。而且我们可以结合JF的JFinalJson一起使用, 对象转字符串用JFinalJson,字符串转对象用HuToolJson即可。
上石马:
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONConfig; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.jfinal.json.JFinalJson; import com.jfinal.json.Json; import com.jfinal.kit.StrKit; import com.jfinal.plugin.activerecord.Record; import java.util.ArrayList; import java.util.List; import java.util.Map; public class HuToolJson extends Json { private static final JSONConfig config = JSONConfig.create(); public static HuToolJson getJson() { return new HuToolJson(); } public String toJson(Object object) { return JFinalJson.getJson().toJson(object); } public <T> T parse(String jsonString, Class<T> type) { return JSONUtil.toBean(jsonString, config, type); } @SuppressWarnings({"unchecked", "rawtypes"}) public static Record toRecord(Object obj){ if (obj == null) return null; Record ret = new Record(); if (obj instanceof Map){ ret.setColumns((Map) obj); } if (obj instanceof Record){ ret.setColumns((Record) obj); } if (obj instanceof String){ ret.setColumns(newObject(obj.toString())); } //其他类型的 return ret; } @SuppressWarnings("rawtypes") public static List<Record> toRecordList(Object obj){ if (obj == null) return null; List<Record> ret = new ArrayList<>(); if (obj instanceof Map){ ret.add(toRecord(obj)); return ret; } List arr = null; if (obj instanceof List){ arr = (List) obj; } if (obj instanceof String){ arr = newArray(obj.toString()); } if (arr != null){ for (Object x : arr) { ret.add(toRecord(x)); } } return ret; } public static JSONObject newObject(){ return new JSONObject(config); } public static JSONObject newObject(String jsonStr){ if (StrKit.isBlank(jsonStr)){ return newObject(); } return new JSONObject(jsonStr, config); } public static JSONArray newArray(){ return new JSONArray(config); } public static JSONArray newArray(String jsonStr){ if (StrKit.isBlank(jsonStr)){ return newArray(); } return new JSONArray(jsonStr, config); } public static boolean isBlank(Object value){ switch (value) { case String s -> { if (StrKit.isBlank(s)) { return true; } } case List<?> objects -> { if (objects.isEmpty()) { return true; } } case Map<?, ?> map -> { if (map.isEmpty()) { return true; } } case null -> { return true; } default -> { return false; } } return false; } }
业务经常用到对象转为 Record的处理,所以这里也加了几个转的方法。
(我们业务数据层级不深只有一级包装,看自己业务是否要改为递归处理啥的)。
import com.jfinal.json.IJsonFactory; import com.jfinal.json.Json; public class HuToolFactory implements IJsonFactory { private static final HuToolFactory me = new HuToolFactory(); public static HuToolFactory me() { return me; } public Json getJson() { return HuToolJson.getJson(); } }
JFinalConfig 子类配置一下:
... public void configConstant(Constants me) { //使用HuTool JSON工具 me.setJsonFactory(HuToolFactory.me()); } ...
项目里面使用HuToolJson.xxx 多一点。
注意非fastjson不能使用JF内置的me.setResolveJsonRequest了。
Controller接收json参数时,需要使用传统getRawData()再转了,
我项目是使用自定义的JsonHttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper,Handler 位置包装的。
再ApiBaseController extends Controller 重写了一些方法。