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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)