如题,最近接了一个新项目,全新开发,就使用了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 重写了一些方法。