自動(dòng)根據(jù)json字符串生成javabean類
你還在為文檔里鋪天蓋地滴變量, 結(jié)構(gòu)復(fù)雜的json而煩惱嗎~
寫錯(cuò)了一個(gè)類型,然后各種崩潰
寫錯(cuò)了一個(gè)變量名無(wú)法解析
代碼工具來(lái)啦~
自動(dòng)生成javabean類,只要一鍵~
此系列的代碼工具就致力于此,替你完成這些無(wú)聊的工作,讓你有更多的精力時(shí)間研究新姿勢(shì)
使用方法
先將代碼工具導(dǎo)入Eclipse, 該項(xiàng)目為Java Project,注意不是Android Project
1.將json字符串?dāng)?shù)據(jù)復(fù)制到項(xiàng)目中的jsonString.txt文件中
(json數(shù)據(jù)可以從文檔中的json數(shù)據(jù)示例里,或先運(yùn)行一遍接口調(diào)用代碼打印出來(lái)json字符串獲取到)
2.運(yùn)行代碼工具中的JsonUTIls類,其中的main函數(shù)中會(huì)運(yùn)行json解析主方法
3.打開JsonBean.java文件,刷新,復(fù)制其中自動(dòng)生成好的javabean類直接使用
補(bǔ)充
如果需要public修飾變量,可以ctrl+F進(jìn)行全部替換
如果需要生成getter and setter方法,可以右鍵Source-》Generate Getter and Setter進(jìn)行設(shè)置
工具代碼已開源,也可以根據(jù)需求自行修改
好了,工具使用到此結(jié)束,后面介紹下代碼原理等
原理
項(xiàng)目為一個(gè)Java Project
利用Gson工具將字符串樹結(jié)構(gòu)解析出來(lái),然后利用File IO流將bean結(jié)構(gòu)根據(jù)需求生成代碼再寫入到文件中
可見項(xiàng)目中源碼,良心注釋,幾乎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)換為對(duì)應(yīng)的javabean
* 用法:
* 將json字符串拷貝至本項(xiàng)目中/Json/JsonString.txt 文件中去,然后調(diào)用該方法,
* 就會(huì)在本項(xiàng)目中/Json/JsonBean.java中生成一個(gè)對(duì)應(yīng)的JavaBean類
* 注意:
* 如果json字符串中有null或者空集合[]這種無(wú)法判斷類型的,會(huì)統(tǒng)一使用Object類型
*/
public static void parseJson2Java() {
/// 讀取json字符串
String string = FileUtils.readToString(new File(“Json\JsonString.txt”), “UTF-8”);
// 解析獲取整個(gè)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)建對(duì)應(yīng)的javabean文件內(nèi)容
String javaBeanStr = createJavaBean(jsonBeanTree);
// 將生成的內(nèi)容寫入到文件中去
FileUtils.writeString2File(javaBeanStr, new File(“Json\JsonBean.java”));
}
/**
* 根據(jù)解析好的數(shù)據(jù)創(chuàng)建生成對(duì)應(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 { ”);
// 由于在循環(huán)的時(shí)候有移除操作,所以使用迭代器遍歷
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)識(shí)符不做其他操作
hasCustomeClass = true;
} else {
// 如果不是自定義子類,則根據(jù)類型名和控件對(duì)象名生成變量申明語(yǔ)句
// private TextView tv_name;
sb.append(“ private ”)
.append(getTypeName(j2j))
.append(“ ”)
.append(j2j.getName())
.append(“; ”);