1. 程式人生 > >Json自動生成JavaBean工具

Json自動生成JavaBean工具

package jsonUtilJar;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map.Entry;
import java.util.Set;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class Json2BeanUtil {
	/**
	 * 讀取本地json檔案,生成對應的JavaBean
	 * @param sourceFilePath	json檔案路徑地址  	eg:"jsonFile/json.text"
	 * @param targetPath		生成JavaBean路徑 	eg:"jsonFile/"
	 * @throws IOException
	 */
	@SuppressWarnings("resource")
	public static void json2Bean(String sourceFilePath, String targetPath) throws IOException {
		JSONObject jsonObject = JSON.parseObject(getJsonStr(sourceFilePath));
		
		boolean b = template(jsonObject, targetPath);
		if(true == b) {
			System.out.println("json生成JavaBean成功!");
		}
	}
	
	/**
	 * 	IO讀取json原始檔
	 * @param path	json原始檔地址
	 * @return
	 * @throws IOException
	 */
	private static String getJsonStr(String path) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(new File(path)));
		StringBuilder builder = new StringBuilder();
		String line = "";
		while((line = br.readLine()) != null) {
			builder.append(line);
		}
		br.close();
		return builder.toString();
	}
	
	/**
	 * 	IO寫入JavaBean檔案
	 * @param bean		JavaBean字串
	 * @param path		JavaBean檔案路徑
	 * @return
	 * @throws IOException
	 */
	private static boolean writeJavaBean(String bean, String path) throws IOException {
		BufferedWriter bw = new BufferedWriter(new FileWriter(new File(path)));
		bw.write(bean);
		bw.close();
		return true;
	}
	
	/**
	 * 	生成JavaBean
	 * @param jsonObject	源json物件
	 * @param targetPath	Java檔案路徑
	 * @return
	 * @throws IOException
	 */
	private static boolean template(JSONObject jsonObject, String targetPath) throws IOException {
		boolean b = template(jsonObject, targetPath, null);
		return b;		
	}
	
	/**
	 * 	首字母大寫
	 * @param string
	 * @return
	 */
	private static String firstUpcase(String string) {
		if(null == string) {
			return "";
		}
		String str1 = string.substring(0, 1);
		String str2 = string.substring(1);
		return str1.toUpperCase() + str2;
	}
	
	/**
	 * 	生成所有欄位
	 * @param jsonObject	源json物件
	 * @param targetPath	JavaBean檔案路徑
	 * @return
	 * @throws IOException
	 */
	private static String generateFields(JSONObject jsonObject, String targetPath) throws IOException {
		if(null == jsonObject || jsonObject.size() == 0) {
			return "";
		}
		Set<Entry<String, Object>> entrySet = jsonObject.entrySet();
		StringBuilder builder = new StringBuilder();
		for (Entry<String, Object> entry : entrySet) {
			String fieldType = "String";
			//如果欄位型別是List或者Map,需要遞迴生成子依賴類
			Object value = entry.getValue();
			if(value instanceof JSONArray) {
				JSONArray jsonArr = (JSONArray) value;
				Object object = "";
				if(null != jsonArr && jsonArr.size() > 0) {
					object = jsonArr.get(0);
				}
				String beanName = formatBeanName(entry.getKey());
				template(JSONObject.parseObject(object.toString()), targetPath, beanName);
				fieldType = "List<" + beanName + ">";
				builder.append(generateField(entry.getKey(), fieldType));
			}else if(value instanceof JSONObject) {
				JSONObject jsonObj = (JSONObject) value; 
				String beanName = formatBeanName(entry.getKey());
				template(jsonObj, targetPath, beanName);
				fieldType = beanName;
				builder.append(generateField(entry.getKey(), fieldType));
			}else {
				builder.append(generateField(entry.getKey(), fieldType));
			}
			
		}
		return builder.toString();
	}
	
	/**
	 * 生成所有get/set方法
	 * @param jsonObject	源json物件
	 * @return
	 * @throws IOException
	 */
	private static String generateMethods(JSONObject jsonObject) throws IOException {
		if(null == jsonObject || jsonObject.size() == 0) {
			return "";
		}
		Set<Entry<String, Object>> entrySet = jsonObject.entrySet();
		StringBuilder builder = new StringBuilder();
		for (Entry<String, Object> entry : entrySet) {
			String fieldType = "String";
			//如果欄位型別是List或者Map,需要遞迴生成子依賴類
			Object value = entry.getValue();
			if(value instanceof JSONArray) {
				String beanName = formatBeanName(entry.getKey());
				fieldType = "List<" + beanName + ">";
				builder.append(generateMethod(entry.getKey(), fieldType));
			}else if(value instanceof JSONObject) {
				String beanName = formatBeanName(entry.getKey());
				fieldType = beanName;
				builder.append(generateMethod(entry.getKey(), fieldType));
			}else {
				builder.append(generateMethod(entry.getKey(), fieldType));
			}
			
		}
		return builder.toString();
	}
	
	/**
	 *  生成單個欄位
	 * @param field			欄位名
	 * @param fieldType		欄位型別
	 * @return
	 */
	private static String generateField(String field, String fieldType) {
		if(null == field || "" == field || null == fieldType || "" == fieldType) {
			return "";
		}
		StringBuilder builder = new StringBuilder();
		builder.append("\t")
		.append("private ")
		.append(fieldType).append(" ")
		.append(field)
		.append(";")
		.append("\r\n");
		return builder.toString();
	}
	
	/**
	 * 生成單個get/set方法
	 * @param field			欄位名
	 * @param fieldType		欄位型別
	 * @return
	 */
	private static String generateMethod(String field, String fieldType) {
		if(null == field || "" == field || null == fieldType || "" == fieldType) {
			return "";
		}
		StringBuilder builder = new StringBuilder();
		builder.append("\t").append("public ").append(fieldType).append(" get").append(firstUpcase(field)).append("() {")
		.append("\r\n")
		.append("\t").append("\t").append("return ").append(field).append(";")
		.append("\r\n")
		.append("\t").append("}");

		builder.append("\r\n");

		builder.append("\t").append("public void set").append(firstUpcase(field)).append("(").append(fieldType).append(" ").append(field).append(") {")
		.append("\r\n")
		.append("\t").append("\t").append("this. ").append(field).append(" = ").append(field).append(";")
		.append("\r\n")
		.append("\t").append("}");

		builder.append("\r\n");
		
		return builder.toString();
	}
	
	/**
	 * 	生成JavaBean
	 * @param jsonObject	源json物件
	 * @param targetPath	JavaBean生成路徑
	 * @param beanName		JavaBean名
	 * @return
	 * @throws IOException
	 */
	private static boolean template(JSONObject jsonObject, String targetPath, String beanName) throws IOException {
		if(null == beanName || "" == beanName) {
			beanName = "JsonBean";
		}
		StringBuilder builder = new StringBuilder();
		builder.append("public class ").append(beanName).append(" {");
		builder.append("\r\n");
		
		if(null != jsonObject && jsonObject.size() > 0) {
			String fields = generateFields(jsonObject, targetPath);
			String methods = generateMethods(jsonObject);
			builder.append(fields).append(methods);
		}
		
		builder.append("}");
		String path = targetPath + beanName + ".java";
		boolean b = writeJavaBean(builder.toString(),path);
		return b;
	}
	
	/**
	 * 	欄位格式化,去除_並大寫首字母
	 * @param beanName	JavaBean名
	 * @return
	 */
	private static String formatBeanName(String beanName) {
		if(null == beanName || "".equals(beanName)) {
			return "";
		}
		String[] split = beanName.split("_");
		StringBuilder builder = new StringBuilder();
		if(null != split && split.length > 0) {
			for (String str : split) {
				builder.append(firstUpcase(str));
			}
		}
		return builder.toString();
	}
}