你還在為文檔里鋪天蓋地滴變量, 結(jié)構(gòu)復(fù)雜的json而煩惱嗎~
寫錯了一個類型,然后各種崩潰
寫錯了一個變量名無法解析
代碼工具來啦~
自動生成javabean類,只要一鍵~
此系列的代碼工具就致力于此,替你完成這些無聊的工作,讓你有更多的精力時間研究新姿勢
使用方法
先將代碼工具導(dǎo)入Eclipse, 該項目為Java Project,注意不是Android Project
1.將json字符串?dāng)?shù)據(jù)復(fù)制到項目中的jsonString.txt文件中
(json數(shù)據(jù)可以從文檔中的json數(shù)據(jù)示例里,或先運行一遍接口調(diào)用代碼打印出來json字符串獲取到)
2.運行代碼工具中的JsonUtils類,其中的main函數(shù)中會運行json解析主方法
3.打開JsonBean.java文件,刷新,復(fù)制其中自動生成好的javabean類直接使用
補充
如果需要public修飾變量,可以ctrl+F進(jìn)行全部替換
如果需要生成getter and setter方法,可以右鍵Source-》Generate Getter and Setter進(jìn)行設(shè)置
工具代碼已開源,也可以根據(jù)需求自行修改
好了,工具使用到此結(jié)束,后面介紹下代碼原理等
原理
項目為一個Java Project
利用Gson工具將字符串樹結(jié)構(gòu)解析出來,然后利用File IO流將bean結(jié)構(gòu)根據(jù)需求生成代碼再寫入到文件中
可見項目中源碼,良心注釋,幾乎2行代碼1行注釋
這里也貼出下核心類JsonUtils的代碼
package utils;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import entity.ArrayType;
import entity.Json2JavaElement;
public class JsonUtils {
public static void main(String[] args) {
parseJson2Java();
}
/**
* 將json字符串轉(zhuǎn)換為對應(yīng)的javabean
* 用法:
* 將json字符串拷貝至本項目中/Json/JsonString.txt 文件中去,然后調(diào)用該方法,
* 就會在本項目中/Json/JsonBean.java中生成一個對應(yīng)的JavaBean類
* 注意:
* 如果json字符串中有null或者空集合[]這種無法判斷類型的,會統(tǒng)一使用Object類型
*/
public static void parseJson2Java() {
/// 讀取json字符串
String string = FileUtils.readToString(new File(“Json\\JsonString.txt”), “UTF-8”);
// 解析獲取整個json結(jié)構(gòu)集合
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(string);
JsonObject jo = element.getAsJsonObject();
ListjsonBeanTree = getJsonBeanTree(jo);
// 利用獲取到的json結(jié)構(gòu)集合,創(chuàng)建對應(yīng)的javabean文件內(nèi)容
String javaBeanStr = createJavaBean(jsonBeanTree);
// 將生成的內(nèi)容寫入到文件中去
FileUtils.writeString2File(javaBeanStr, new File(“Json\\JsonBean.java”));
}
/**
* 根據(jù)解析好的數(shù)據(jù)創(chuàng)建生成對應(yīng)的javabean類字符串
*
* @param jsonBeanTree 解析好的數(shù)據(jù)集合
* @return 生成的javabean類字符串
*/
private static String createJavaBean(ListjsonBeanTree) {
StringBuilder sb = new StringBuilder();
// 是否包含自定義子類
boolean hasCustomeClass = false;
ListcustomClassNames = new ArrayList();
sb.append(“public class JsonBeans {\n”);
// 由于在循環(huán)的時候有移除操作,所以使用迭代器遍歷
Iteratoriterator = jsonBeanTree.iterator();
while(iterator.hasNext()) {
Json2JavaElement j2j = iterator.next();
// 保存自定義類名稱至集合中,注意已經(jīng)包含的不再添加
if(j2j.getCustomClassName() != null && !customClassNames.contains(j2j.getCustomClassName())) {
customClassNames.add(j2j.getCustomClassName());
}
if(j2j.getParentJb() != null) {
// 如果有parent,則為自定義子類,設(shè)置標(biāo)識符不做其他操作
hasCustomeClass = true;
} else {
// 如果不是自定義子類,則根據(jù)類型名和控件對象名生成變量申明語句
// private TextView tv_name;
sb.append(“\tprivate ”)
.append(getTypeName(j2j))
.append(“ ”)
.append(j2j.getName())
.append(“;\n”);
評論
查看更多