Json 2 POJO

public class Json2Object {
	private static final BufferedReader	br	= new BufferedReader(new InputStreamReader(System.in));

	private static FileWriter getFileWriter(String className) throws IOException {
		File targetPath = new File("gen");
		if (!targetPath.exists()) {
			targetPath.mkdirs();
		}
		File file = new File(targetPath, StringUtils.capitalize(className) + ".java");
		return new FileWriter(file);
	}

	private static void cleanTargetPath() throws IOException {
		FileUtils.deleteDirectory(new File("gen"));
	}

	private static JSON getInputJson() throws IOException {
		System.out.println("请输入要转化为对象的Json字符串!");
		String json = br.readLine();
		try {
			json = StringUtils.strip(json);
			if (json.startsWith("[")) {
				return JSONArray.parseArray(json);
			} else {
				return JSONObject.parseObject(json, JSONObject.class);
			}
		} catch (Exception e) {
			System.err.println("输入的不是标准的json,请重新输入Json字符串!");
			return getInputJson();
		}
	}

	private static String getPkgOrClassName(String promotion) throws IOException {
		System.out.println("请输入" + promotion + "");
		String json = br.readLine();
		if (StringUtils.isNotEmpty(json)) {
			return json;
		} else {
			System.out.println("输入的" + promotion + "为空,请重新输入!");
			return getPkgOrClassName(promotion);
		}
	}

	private static void genJavaBean(JSON json, String pkgName, String className) throws IOException {
		List<String> readLines = ResouceUtil.getResouceLines("ClassTempldate.txt");
		readLines = LineProcessor.changeLines(readLines, "###pkgName###", pkgName);
		readLines = LineProcessor.changeLines(readLines, "###VoName###", StringUtils.capitalize(className));

		StringBuilder propertyBuilder = new StringBuilder();
		if (JSONObject.class.equals(json.getClass())) {
			JSONObject jsonObject = (JSONObject) json;
			for (String key : jsonObject.keySet()) {
				Object object = jsonObject.get(key);

				String matchType = matchType(object, key);
				propertyBuilder.append("public ").append(matchType).append(" ").append(key).append(";\r\n\t");
				if (JSONObject.class.equals(object.getClass())) {
					genJavaBean((JSONObject) object, pkgName, StringUtils.capitalize(key));
				} else if (JSONArray.class.equals(object.getClass())) {
					JSONArray jsonArray = (JSONArray) object;
					Iterator<Object> iterator = jsonArray.iterator();
					if (iterator.hasNext()) {// 如果集合的内容不为空的话,判定里面的内容的类型
						Object next = iterator.next();
						if (JSONObject.class.equals(next.getClass()) || JSONArray.class.equals(next.getClass())) {
							String innerClassName = getPkgOrClassName(next.toString());
							genJavaBean((JSON) next, pkgName, innerClassName);
						}
					}
				}
			}
		} else if (JSONArray.class.equals(json.getClass())) {
			JSONArray jsonArray = (JSONArray) json;
			Iterator<Object> iterator = jsonArray.iterator();
			if (iterator.hasNext()) {// 如果集合的内容不为空的话,判定里面的内容的类型
				Object next = iterator.next();
				System.out.println(next.getClass().getName());
				String matchType = matchType(next.getClass(), "");
				if (JSONObject.class.equals(next.getClass()) || JSONArray.class.equals(next.getClass())) {
					String innerClassName = getPkgOrClassName(next.toString());
					if (StringUtils.isEmpty(matchType)) {
						propertyBuilder.append("public ").append(StringUtils.capitalize(innerClassName)).append("[] ;\r\n\t");
					}
					genJavaBean((JSON) next, pkgName, innerClassName);
				} else {
					propertyBuilder.append("public ").append(matchType).append("[] ;\r\n\t");
				}

			} else {
				propertyBuilder.append("public String[] ").append(" ;\r\n\t");
			}
		} else {
			System.err.println("错误的类型,请修改程序支持");
		}
		readLines = LineProcessor.changeLines(readLines, "###columns###", propertyBuilder.toString());
		FileWriter fileWriter = getFileWriter(className);
		IOUtils.writeLines(readLines, null, fileWriter);
		fileWriter.close();
	}

	public static String matchType(Object object, String key) {
		Class<?> clazz = object.getClass();
		if (String.class.equals(clazz)) {
			return "String";
		} else if (Integer.class.equals(clazz)) {
			return "int";
		} else if (Float.class.equals(clazz)) {
			return "float";
		} else if (Date.class.equals(clazz)) {
			return "Date";
		} else if (Boolean.class.equals(clazz)) {
			return "boolean";
		} else if (Long.class.equals(clazz) || BigDecimal.class.equals(clazz)) {
			return "long";
		} else if (JSONObject.class.equals(clazz)) {
			return StringUtils.capitalize(key);
		} else if (JSONArray.class.equals(clazz)) {
			JSONArray jsonArray = (JSONArray) object;
			Iterator<Object> iterator = jsonArray.iterator();
			if (iterator.hasNext()) {// 如果集合的内容不为空的话,判定里面的内容的类型
				Object next = iterator.next();
				return matchType(next, key) + "[]";
			} else {// 如果集合为空的话,默认为空即可
				return "String[]";
			}
		}
		throw new RuntimeException("未知类型" + clazz);
	}

	public static void main(String[] args) throws IOException {
		JSON json = getInputJson();
		// String pkgName = getPkgOrClassName("包名");
		String pkgName = "com.test.cn";
		// String className = getPkgOrClassName("类名");
		String className = "query";
		cleanTargetPath();
		System.out.println(json.getClass());
		genJavaBean(json, pkgName, className);
	}

}

public class ResouceUtil {

	public static List<String> getResouceLines(String fileName){
		try(InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);) {
			return IOUtils.readLines(resourceAsStream);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}
public class LineProcessor {

	public static List<String> changeLines(List<String> readLines,String templdate, String targetValue) {
		List<String> resultLines = new ArrayList<String>();
		for (String line: readLines) {
			line = line.replace(templdate,targetValue);
			resultLines.add(line);
		}
		return resultLines;
	}

}

ClassTempldate.txt中的内容为:

package ###pkgName###.domain;


import com.alibaba.fastjson.JSONObject;


public class ###VoName### { 


###columns###

@Override
public String toString() {
return JSONObject.toJSONString(this);
}
}



转载于:https://my.oschina.net/u/590649/blog/465625

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值