package com.runt.android.actions; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * My father is Object, ites purpose of * * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-11-10. */ public class CreateNormalResult extends BaseCreateApiResult { /** * 获取json中解析的变量集合 * @param jsonStr * @return */ @Override protected Map getFieldNormalMap(String jsonStr){ return getFieldNormalMap(new JSONObject(jsonStr)); } /** * 获取json中解析的变量集合 * @param jsonObject * @return */ @Override protected Map getFieldNormalMap(JSONObject jsonObject){ Map fieldMap = new HashMap<>(); for(String key: jsonObject.keySet()){ Object obj = jsonObject.get(key); key = humpName(key);//驼峰命名 String clssName = obj.getClass().getSimpleName();//声明变量的数据类型 if(obj instanceof JSONArray){ Object val = ((JSONArray)obj).get(0); if(val instanceof JSONObject){ //将声明的变量定义为变量数据类型 String name = replaseS(key);//去复数 clssName ="java.util.List<"+toUperFirst(name)+">"; }else { clssName ="java.util.List<"+val.getClass().getSimpleName()+">"; } }else if(obj instanceof JSONObject){ //将声明的变量定义为变量数据类型 clssName = toUperFirst(key); } //将key作为声明的变量名 if(fieldMap.get(clssName) == null){//没有同数据类型的变量 fieldMap.put(clssName,key); }else if(fieldMap.get(clssName) instanceof List){//已有同数据类型的变量 List vlus = (List) fieldMap.get(clssName); vlus.add(key);//追加 }else {//已有同数据类型的变量,转变为集合 List vlus = new ArrayList(); String field = fieldMap.get(clssName).toString(); vlus.add(field); vlus.add(key);//追加 fieldMap.replace(clssName,vlus);//替换为集合 } } return fieldMap; } protected String getClassStr (String json){ return getClassStr(new JSONObject(json)); } /** * 遍历json 创建内部类代码 * @param jsonObject * @return */ protected String getClassStr ( JSONObject jsonObject){ StringBuilder sb = new StringBuilder(); for(String key: jsonObject.keySet()){//遍历 Object obj = jsonObject.get(key); if(obj instanceof JSONArray){ Object val = ((JSONArray)obj).get(0); if(val instanceof JSONObject){//判断值是否为object String name = replaseS(key);//去复数 sb.append(getClassStr(name,(JSONObject)val));//创建类代码 } }else if(obj instanceof JSONObject){//判断值是否为object String name = replaseS(key);//去复数 sb.append(getClassStr(name,(JSONObject)obj));//创建类代码 } } return sb.toString(); } /** * 生成内部类 * @param name * @param jsonObject * @return */ private String getClassStr(String name,JSONObject jsonObject){ Map fieldMap = getFieldNormalMap(jsonObject); List list = new ArrayList<>(); for(String key: fieldMap.keySet()){ if(fieldMap.get(key) instanceof List){ list.addAll((List)fieldMap.get(key)); }else{ list.add(fieldMap.get(key).toString()); } } String classStr = getClassStr(jsonObject);//是否含有内部类 name = toUperFirst(name); String template = getTemplateString("NormalClass") .replace("{fields}", getFields(jsonObject))//替换写入声明变量 .replace("{name}", name)//类名 .replace("{class}",classStr)//内部类 .replace("{toString}",getToString(name,list.toArray(new String[0]))); return template; } @Override public void createResultFile(String filePath, String packageName, String[] object) { Map fieldMap = getFieldNormalMap(object[1]); List list = new ArrayList<>(); for(String key: fieldMap.keySet()){ if(fieldMap.get(key) instanceof List){ list.addAll((List)fieldMap.get(key)); }else{ list.add(fieldMap.get(key).toString()); } } createFile(filePath,object[0],getFields(object[1]),packageName,"NormalResult",list.toArray(new String[0]),getClassStr(object[1]),""); } @Override public void createResultFile(String filePath, String name, String fieldsStr, String packageName, String[] fields) { createFile(filePath,name,fieldsStr,packageName,"NormalResult",fields,"",""); } /** * 去掉复数形式 * @param str * @return */ public static String replaseS(String str){ if( replaseS(str,"ves")){ return str.replace("ves","f"); }else if( replaseS(str,"ies")){ return str.replace("ies","y"); }else if( replaseS(str,"es")){ return str.replace("es",""); }else if( replaseS(str,"s" ) ){ return str.replace("s",""); }else if( replaseS(str,"men")){ return str.replace("men","man"); } return str; } public static boolean replaseS(String str,String Sstr ){ if(str.lastIndexOf(Sstr) == str.length()-Sstr.length()){ return true; } return false; } }