// 根據類型名和控件對象名生成變量申明語句
// private TextView tv_name;
sb.append(“\t\tprivate ”)
.append(getTypeName(j2j))
.append(“ ”)
.append(j2j.getName())
.append(“;\n”);
// 已經使用的數據會移除,減少下一次外層循環的遍歷次數
customIterator.remove();
}
}
sb.append(“\t}\n”);
}
}
sb.append(“}”);
return sb.toString();
}
/**
* 遞歸遍歷整個json數據結構,保存至jsonBeans集合中
*
* @param rootJo 根json對象
* @return 解析好的數據集合
*/
private static ListgetJsonBeanTree(JsonObject rootJo) {
jsonBeans = new ArrayList();
recursionJson(rootJo, null);
return jsonBeans;
}
/**
* 保存遞歸獲取到數據的集合
*/
private static ListjsonBeans = new ArrayList();
/**
* 遞歸獲取json數據
*
* @param jo 當前遞歸解析的json對象
* @param parent 已經解析好的上一級數據,無上一級時傳入null
*/
private static void recursionJson(JsonObject jo, Json2JavaElement parent) {
// 循環整個json對象的鍵值對
for (Entry entry : jo.entrySet()) {
// json對象的鍵值對建構為 {“key”:value}
// 其中,值可能是基礎類型,也可能是集合或者對象,先解析為json元素
String name = entry.getKey();
JsonElement je = entry.getValue();
Json2JavaElement j2j = new Json2JavaElement();
j2j.setName(name);
if(parent != null) {
j2j.setParentJb(parent);
}
// 獲取json元素的類型,可能為多種情況,如下
Classtype = getJsonType(je);
if(type == null) {
// 自定義類型
// json鍵值的首字母轉為大寫,作為自定義類名
j2j.setCustomClassName(StringUtils.firstToUpperCase(name));
// ?
j2j.setSouceJo(je.getAsJsonObject());
jsonBeans.add(j2j);
// 自定義類需要繼續遞歸,解析自定義類中的json結構
recursionJson(je.getAsJsonObject(), j2j);
} else if(type.equals(JsonArray.class)) {
// 集合類型
// 重置集合數據,并獲取當前json元素的集合類型信息
deepLevel = 0;
arrayType = new ArrayType();
getJsonArrayType(je.getAsJsonArray());
j2j.setArray(true);
j2j.setArrayDeep(deepLevel);
if(arrayType.getJo() != null) {
j2j.setCustomClassName(StringUtils.firstToUpperCase(name));
// 集合內的末點元素類型為自定義類, 遞歸
recursionJson(arrayType.getJo(), j2j);
} else {
j2j.setType(arrayType.getType());
}
jsonBeans.add(j2j);
} else {
// 其他情況,一般都是String,int等基礎數據類型
j2j.setType(type);
jsonBeans.add(j2j);
}
}
}
/**
* 集合深度,如果是3則為ArrayList》》
*/
private static int deepLevel = 0;
/**
* 集合類型數據,用于保存遞歸獲取到的集合信息
*/
private static ArrayType arrayType = new ArrayType();
/**
* 遞歸獲取集合的深度和類型等信息
*
* @param jsonArray json集合數據
*/
private static void getJsonArrayType(JsonArray jsonArray) {
// 每次遞歸,集合深度+1
deepLevel ++;
if (jsonArray.size() == 0) {
// 如果集合為空,則集合內元素類型無法判斷,直接設為Object
arrayType.setArrayDeep(deepLevel);
arrayType.setType(Object.class);
} else {
// 如果集合非空則取出第一個元素進行判斷
JsonElement childJe = jsonArray.get(0);
// 獲取json元素的類型
Classtype = getJsonType(childJe);
if(type == null) {
// 自定義類型
// 設置整個json對象,用于后續進行進一步解析處理
arrayType.setJo(childJe.getAsJsonObject());
arrayType.setArrayDeep(deepLevel);
} else if (type.equals(JsonArray.class)) {
// 集合類型
// 如果集合里面還是集合,則遞歸本方法
getJsonArrayType(childJe.getAsJsonArray());
} else {
// 其他情況,一般都是String,int等基礎數據類型
arrayType.setArrayDeep(deepLevel);
arrayType.setType(type);
}
}
}
/**
* 獲取json元素的類型
*
* @param je json元素
* @return 類型
*/
private static ClassgetJsonType(JsonElement je) {
Classclazz = null;
if(je.isJsonNull()) {
// 數據為null時,無法獲取類型,則視為object類型
clazz = Object.class;
} else if(je.isJsonPrimitive()) {
// primitive類型為基礎數據類型,如String,int等
clazz = getJsonPrimitiveType(je);
} else if(je.isJsonObject()) {
// 自定義類型參數則返回null,讓json的解析遞歸進行進一步處理
clazz = null;
} else if(je.isJsonArray()) {
// json集合類型
clazz = JsonArray.class;
}
return clazz;
}
/**
* 將json元素中的json基礎類型,轉換為String.class,int.class等具體的類型
*
* @param je json元素
* @return 具體數據類型,無法預估的類型統一視為Object.class類型
*/
private static ClassgetJsonPrimitiveType(JsonElement je) {
Classclazz = Object.class;
JsonPrimitive jp = je.getAsJsonPrimitive();
// json中的類型會將數字集合成一個總的number類型,需要分別判斷
if(jp.isNumber()) {
String num = jp.getAsString();
if(num.contains(“。”)) {
// 如果包含“。”則為小數,先嘗試解析成float,如果失敗則視為double
try {
Float.parseFloat(num);
clazz = float.class;
} catch(NumberFormatException e) {
clazz = double.class;
}
} else {
// 如果不包含“。”則為整數,先嘗試解析成int,如果失敗則視為long
try {
Integer.parseInt(num);
clazz = int.class;
} catch(NumberFormatException e) {
clazz = long.class;
}
}
} else if(jp.isBoolean()) {
clazz = boolean.class;
} else if(jp.isString()) {
clazz = String.class;
}
// json中沒有其他具體類型如byte等
return clazz;
}
/**
* 獲取類型名稱字符串
*
* @param j2j 轉換數據元素
* @return 類型名稱,無法獲取時,默認Object
*/
private static String getTypeName(Json2JavaElement j2j) {
String name = “Object”;
Classtype = j2j.getType();
if(j2j.getCustomClassName() != null && j2j.getCustomClassName().length() 》 0) {
// 自定義類,直接用自定義的名稱customClassName
name = j2j.getCustomClassName();
} else {
// 非自定義類即可以獲取類型,解析類型class的名稱,如String.class就對應String
name = type.getName();
int lastIndexOf = name.lastIndexOf(“。”);
if(lastIndexOf != -1) {
name = name.substring(lastIndexOf + 1);
}
}
// 如果集合深度大于0,則為集合數據,根據深度進行ArrayList嵌套
// 深度為3就是ArrayList
StringBuilder sb = new StringBuilder();
for(int i=0; i
sb.append(“ArrayList《”);
}
sb.append(name);
for(int i=0; i
sb.append(“》”);
}
return sb.toString();
}
評論