工具類
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; } }