JFinal使用技巧-HuToolJson的使用

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

评论区

zzutligang

2024-01-10 09:44

赞一个