FreeMarker将JSON转换实体对象

工具类

复制代码
package com.jachs.freemarker.jsontobean;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class FreemarkerUtil {

    public Template getTemplate(String name) {
        try {
            Configuration cfg = new Configuration();
            cfg.setClassForTemplateLoading(this.getClass(), "/template");
            Template temp = cfg.getTemplate(name);
            return temp;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void fprint(String name, Map<String, Object> root, String outFile) {
        FileWriter out = null;
        try {
            out = new FileWriter("E:\\EclipseWorkSpace\\zabbix\\src\\main\\resources\\template\\" + outFile);
            Template temp = this.getTemplate(name);
            temp.process(root, out);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
复制代码

模板

复制代码
package ${packageName};

<#list nameSpaces as nameSpace>    
${nameSpace}   
</#list> 
    
public class ${className}{
    <#list Construction as construction>    
        ${construction}   
    </#list>
    <#list Constructions as constructions>    
        ${constructions}   
    </#list>
    
    <#list parameters?keys as key> 
        private ${parameters[key]} ${key};
    </#list>
    
    <#list GetSets as GetSet>    
        ${GetSet}   
    </#list> 
}
复制代码

关键代码

复制代码
package com.jachs.freemarker.jsontobean;

import java.io.BufferedReader;
import java.io.FileReader;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;

import org.apache.commons.lang.StringUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;



public class JsonToBean {
    private static Map<String, Object> root=new HashMap<String, Object>();//freeMarker参数集合
    private static final String PRIVATES="private";//私有
    private static final String PUBLICS="public";//公有
    private static final String SEMICOLON=";";//代码结尾
    private static final String IMPORTS="import";//关键字命名空间
    private static final String INTERVAL="\t";//代码间隔
    private static final String COMMA=",";
    private static final String ENTER="/n";
    private static final String LEFTP="(";
    private static final String RIGHTP=")";
    private static final String LEFTC="{";
    private static final String RIGHTC="}";
    private static final String EQUAL="=";
    private static final String GET="get";
    private static final String SET="set";
    private static final String VOID="void";
    private static final String RETURN="return";
    private static final String THIS="this";
    private static final String THIS_="this.";
    private static final String[]KEYWORD=new String[] {"public","private","class","native","import","interface","package"};//字段关键字集合
    private static List<String>keyWord;//字段关键字
    private static TreeSet<String>nameSpaces;//命名空间
    private static TreeMap<String,String>parameters;//对象成员
    private static TreeSet<String>jsonKeySet;//jsonkey暂时保留集合
    
    
    private static String JavaFileNames="ItemGetResponse.java";
    private static String PackageName="com.jachs.zabbix.entity.item.get.dependent.response";
    
    public static void main(String[] args) throws Exception {
        BufferedReader bufferedReader=new BufferedReader(new FileReader(JsonToBean.class.getResource("/json/json.txt").getPath()));
        StringBuffer buffer=new StringBuffer();
        while(bufferedReader.ready()){
            buffer.append(bufferedReader.readLine());
        }
        
        bufferedReader.close();
        keyWord=Arrays.asList(KEYWORD);
        get(buffer.toString(),JavaFileNames);
    }
    private static void get(String json,String FileName){
        if(isJson(json)||isJsonArray(json)){
            parameters=new TreeMap<String, String>();
            nameSpaces=new TreeSet<String>();
            jsonKeySet=new TreeSet<String>();
            JSONObject jsonObject;
            if(isJsonArray(json)){
                jsonObject=JSONObject.parseObject(new JSONObject().parseArray(json).getString(0));//取json数组第一个
            }else{
                jsonObject=JSONObject.parseObject(json);
            }
            String parameterType;
            String parameterKey;
            String keyType=null;
            for (String key : jsonObject.keySet()) {
                keyType=getType(jsonObject.get(key));
                if(keyType.equals(JSONObject.class.getSimpleName())){//json对象
                    parameterType=key;
                    parameterKey=key;
                    jsonKeySet.add(key);
                }else if(keyType.equals(JSONArray.class.getSimpleName())){//json集合
                    nameSpaces.add(IMPORTS+INTERVAL+"java.util.List"+SEMICOLON);//命名空间
                    JSONArray jsonArr=new JSONObject().parseArray(jsonObject.get(key).toString());
                    if(jsonArr.size()>0&&StringUtils.isNotBlank(jsonArr.get(0).toString())) {
                        if(jsonArr.get(0) instanceof String){//二次校验
                            parameterType="List<String>";
                            parameterKey=key;
                        }else if(jsonArr.get(0) instanceof Integer){
                            parameterType="List<Integer>";
                            parameterKey=key;
                        }else if(jsonArr.get(0) instanceof Double){
                            parameterType="List<Double>";
                            parameterKey=key;
                        }else{
                            parameterType="List<"+key+">";
                            parameterKey=key;
                            jsonKeySet.add(key);
                        }
                    }else {
                        parameterType="List<Object>";
                        parameterKey=key;
                    }
                }else{
                    parameterType=keyType;
                    parameterKey=key;
                }
                //keyWord检验
                if(keyWord.contains(parameterKey)) {//关键字
                    parameterKey=parameterKey+"_";
                }
                parameters.put(parameterKey,parameterType);
            }
            root.put("packageName",PackageName);
            root.put("className", FileName.split("\\.")[0]);//文件名不要.java
            root.put("parameters", parameters);
            root.put("nameSpaces", nameSpaces);
            root.put("Construction", Construction(FileName.split("\\.")[0]));//构造方法无参
            root.put("Constructions", Constructions(FileName.split("\\.")[0]));//构造方法带参
            
            root.put("GetSets", GetSet());//GetSet
            new FreemarkerUtil().fprint("01.ftl", root, FileName);
            
            for (String keys : jsonKeySet) {
                get(jsonObject.get(keys).toString(),keys+".java");
            }
        }
    }
    private static List<String> GetSet() {
        List<String>getSetList=new ArrayList<String>();
        for (String keyType : parameters.keySet()) {
            //get
            getSetList.add(PUBLICS+INTERVAL+parameters.get(keyType)+INTERVAL+GET+StringUtils.capitalize(keyType)+LEFTP+RIGHTP+LEFTC);
            getSetList.add(INTERVAL+RETURN+INTERVAL+keyType+SEMICOLON);
            getSetList.add(RIGHTC);
            //set
            getSetList.add(PUBLICS+INTERVAL+VOID+INTERVAL+SET+StringUtils.capitalize(keyType)+LEFTP+parameters.get(keyType)+INTERVAL+keyType+RIGHTP+LEFTC);
            getSetList.add(INTERVAL+THIS_+keyType+EQUAL+keyType+SEMICOLON);
            getSetList.add(RIGHTC);
        }
        return getSetList;
    }
    /***
     * 构造方法无参
     * @param fileName
     * @return
     */
    private static List<String> Construction(String fileName) {
        List<String>constructionList=new ArrayList<String>();
        StringBuffer parmerter=new StringBuffer();
        parmerter.append(PUBLICS).append(INTERVAL).append(fileName).append(LEFTP);
        parmerter.append(RIGHTP).append(LEFTC);
        parmerter.append("super").append(LEFTC).append(RIGHTC).append(SEMICOLON);
        parmerter.append(RIGHTC);
        constructionList.add(parmerter.toString());
        return constructionList;
    }
    /***
     * 构造方法带参
     * @param fileName
     * @return
     */
    private static List<String> Constructions(String fileName) {
        List<String>constructionList=new ArrayList<String>();
        StringBuffer parmerter=new StringBuffer();
        parmerter.append(PUBLICS).append(INTERVAL).append(fileName).append(LEFTP);
        for (String keyType : parameters.keySet()) {
            parmerter.append(parameters.get(keyType)).append(INTERVAL).append(keyType).append(COMMA);
        }
        parmerter=parmerter.delete(parmerter.length()-1,parmerter.length() );//干掉最后一个逗号;
        parmerter.append(RIGHTP).append(LEFTC);
        constructionList.add(parmerter.toString());
        for (String keyType : parameters.keySet()) {
            constructionList.add(INTERVAL+THIS_+keyType+EQUAL+keyType+SEMICOLON);
        }
        constructionList.add(RIGHTC);
        return constructionList;
    }
    
    private static boolean isJsonArray(String json){
        try{
            JSONArray.parseArray(json);
            return true;
        }catch (Exception e) {
            return false;
        }
    }
    private static boolean isJson(String json){
            try{
                JSONObject.parseObject(json);
                return true;
            }catch (Exception e) {
                return false;
            }
    }
    
    /***
     * 获取类型
     * @param object
     * @return
     */
    private static String  getType(Object object){
        if(StringUtils.isNotBlank(object.toString())&&isJson(object.toString())){
            return JSONObject.class.getSimpleName();
        }
        if(StringUtils.isNotBlank(object.toString())&&isJsonArray(object.toString())){
            return JSONArray.class.getSimpleName();
        }
        if(object instanceof Integer){
            return Integer.class.getSimpleName();
        }
        if(object instanceof Float){
            return Float.class.getSimpleName();
        }
        if(object instanceof Double){
            return Double.class.getSimpleName();
        }
        if(object instanceof BigDecimal){
            return BigDecimal.class.getSimpleName();
        }
        if(object instanceof String){
            return String.class.getSimpleName();
        }
        if(object instanceof Boolean){
            return Boolean.class.getSimpleName();
        }
        return null;
    }
}
复制代码

 

posted @   Jachs  阅读(2531)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
人生而自由,却无往不在枷锁中。