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