java 解析json生成实体类
工具类
package com.myspringbootdemo.demo.todo;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.util.*;
/**
* 读取JSON 生成实体类 一级一级生成
* 2022/10/12 09:19 只生成最外围的
* 2022/10/12 15:46 逐级生成
*/
public class ReadJSONGenerateEntityClass {
private static final String JSONObjectString = "{\"date\":\"2022-10-10 22:23:30\",\"errorCode \":\"0 \",\"message \":\"操作成功 \",\"httpStatus \":200,\"obj\":{\"orderNumber \":\"393374805906554880 \",\"mailNumber \":\"SF1020127608391 \",\"resStatus \":2,\"dateClass\":{\"key1 \":\"value1 \",\"key2 \":\"value2 \",\"key3 \":{\"key11\":\"value11\",\"key22\":\"value22\",\"key33\":\"value33\"}},\"dateArray\":[{\"k11\":\"v11\",\"k12\":\"v12\"},{\"k12\":\"v12\",\"k22\":\"v22\"}]},\"oneDateArray\":[{\"onek11\":\"onev11\",\"onek12\":\"onev12\"},{\"onek12\":\"onev12\",\"onek22\":\"onev22\"}]}";
public final static String PACKAGE_NAME = "【包名】";
public final static String CLASS_NAME = "【类名】";
public final static String IMPORT = "import";
public final static String STRING_REMARKS = "【字段描述】";
public final static String FIELD_NAME = "【类型】 【小写字段名】";
public final static String FIELD_TYPE = "【类型】";
public final static String GETTING = "get【大写字段名】";
public final static String BIG = "【大写字段名】";
public final static String SETTING = "set【大写字段名】";
public final static String MIN = "【小写字段名】";
public static void main(String[] args) {
List<String> JSONFileContent = readFile(System.getProperty("user.dir"));
String join = String.join("", JSONFileContent);
System.out.println(join);
String className = "TestGenerateEntityClass";
String pathName= "./src/test/java/com/myspringbootdemo/demo/autogenerate/";
String packagePath = "com.myspringbootdemo.demo.autogenerate";
List<Map> fileList = new ArrayList<>();
Map<String,Map> fileMap = new HashMap<>();
// List<String> dateString = organizeData(JSONObjectString, className, packagePath);
// System.out.println(fileList.size());
// establishFile(className,pathName,dateString);
// organize(fileList,JSONObjectString);
// organize(fileMap,JSONObjectString,className);
organize(fileMap,join,className);//
for (String s : fileMap.keySet()) {
String classNameStr = StringTest.upperTable(s.trim());
List<String> dateString = newOrganizeData(fileMap.get(s), classNameStr, packagePath);
establishFile(classNameStr,pathName,dateString);
}
}
/**
* 读取存储Json的文件
*/
/**
* 读取文件
*/
private static List<String> readFile(String path) {
List<String> fileList = new ArrayList<>();
String fileName = path + "/src/main/resources/static/test.txt";
System.out.println(fileName);
//读取文件
FileReader fileReader = null;
String s = null;
try {
fileReader = new FileReader(fileName);
//把文件存到缓冲区
BufferedReader bufferedReader = new BufferedReader(fileReader);
while((s = bufferedReader.readLine()) != null){
fileList.add(s);
}
} catch (IOException e) {
e.printStackTrace();
}
return fileList;
}
/**
* 新的整理数据
*/
public static List<String> newOrganizeData(Map zhiAndType , String className, String packagePath) {
//最终的数据
List<String> dateString = new ArrayList<>();
//实体类字段
List<String> fieldList = new ArrayList<>();
//get set 器
List<String> gettingAndSettingList = new ArrayList<>();
List<String> template = TestGetTableStructure.getTemplate();
String containsPackageNameStr = TestGetTableStructure.getStringByString(template, PACKAGE_NAME);
String packageNameStr = containsPackageNameStr.replaceAll(PACKAGE_NAME, packagePath);
dateString.add(packageNameStr);
dateString.add("import java.util.Date;");
dateString.add("import java.io.Serializable;");
dateString.add("import java.util.List;");
String containsClassNameStr = getStringByString(template, CLASS_NAME);
String classNameStr = containsClassNameStr.replaceAll(CLASS_NAME, className);
dateString.add(classNameStr);
for (Object key : zhiAndType.keySet()) {
// 类型
Object value = zhiAndType.get(key);
//首字母大写
String s = StringTest.upperTable(String.valueOf(key));
String containsFieldNameStr = getStringByString(template, FIELD_NAME);
String fieldNameStr = containsFieldNameStr.replaceAll(FIELD_NAME, value + " " + key);
if (String.valueOf(value).equals("HashMap")){
fieldNameStr = containsFieldNameStr.replaceAll(FIELD_NAME, s + " " + key);
}
if(String.valueOf(value).equals("ArrayList")){
fieldNameStr = containsFieldNameStr.replaceAll(FIELD_NAME, "List<" + s + "> " + key);
}
fieldList.add(fieldNameStr);
// get构造器
// public 【类型】 get【大写字段名】() { return 【小写字段名】; }
generateGettingAndSetting(gettingAndSettingList, template, key, value, s, GETTING);
// set构造器
// public void set【大写字段名】(【类型】 【小写字段名】) { this.【小写字段名】 = 【小写字段名】; }
generateGettingAndSetting(gettingAndSettingList, template, key, value, s, SETTING);
}
dateString.addAll(fieldList);
dateString.addAll(gettingAndSettingList);
dateString.add("}");
return dateString;
}
private static void organize(List<Map> fileList,String jsonString) {
Map map = TestJsonUtils.json2Map(jsonString);
Map zhiAndType = new HashMap();
for(Object key : map.keySet()){
Object valeue = map.get(key);
String type = TestAnalysisJSON.getTypeByObject(valeue);
zhiAndType.put(key,type);
if (type.equals("HashMap")){
organize(fileList,new JSONObject((Map)valeue).toJSONString());
}
if (type.equals("ArrayList")){
List<Map> list = (List) valeue;
JSONObject jsonObject = new JSONObject(list.get(0));
organize(fileList, jsonObject.toJSONString());
}
}
fileList.add(zhiAndType);
}
public static void organize(Map<String,Map> fileMap,String jsonString,String name) {
Map map = TestJsonUtils.json2Map(jsonString);
Map zhiAndType = new HashMap();
for(Object key : map.keySet()){
Object valeue = map.get(key);
String type = TestAnalysisJSON.getTypeByObject(valeue);
zhiAndType.put(key,type);
if (type.equals("HashMap")){
organize(fileMap,new JSONObject((Map)valeue).toJSONString(),String.valueOf(key));
}
if (type.equals("ArrayList")){
List<Map> list = (List) valeue;
JSONObject jsonObject = new JSONObject(list.get(0));
organize(fileMap, jsonObject.toJSONString(),String.valueOf(key));
}
}
fileMap.put(name,zhiAndType);
}
/**
* 整理数据
* @param className 类名
* @param packagePath 包路径
*/
private static List<String> organizeData (String jsonObjectString, String className, String packagePath) {
//最终的数据
List<String> dateString = new ArrayList<>();
//实体类字段
List<String> fieldList = new ArrayList<>();
//get set 器
List<String> gettingAndSettingList = new ArrayList<>();
List<String> template = TestGetTableStructure.getTemplate();
Map map = TestJsonUtils.json2Map(jsonObjectString);
// System.out.println(map);
Set keySet = map.keySet();
Map zhiAndType = new HashMap();
for (Object key : keySet) {
zhiAndType.put(key,TestAnalysisJSON.getTypeByObject(map.get(key)));
}
// System.out.println(zhiAndType);
String containsPackageNameStr = TestGetTableStructure.getStringByString(template, PACKAGE_NAME);
String packageNameStr = containsPackageNameStr.replaceAll(PACKAGE_NAME, packagePath);
dateString.add(packageNameStr);
dateString.add("import java.util.Date;");
dateString.add("import java.io.Serializable;");
dateString.add("import java.util.List;");
String containsClassNameStr = getStringByString(template, CLASS_NAME);
String classNameStr = containsClassNameStr.replaceAll(CLASS_NAME, className);
dateString.add(classNameStr);
for (Object key : zhiAndType.keySet()) {
// 类型
Object value = zhiAndType.get(key);
//首字母大写
String s = StringTest.upperTable(String.valueOf(key));
String containsFieldNameStr = getStringByString(template, FIELD_NAME);
String fieldNameStr = containsFieldNameStr.replaceAll(FIELD_NAME, value + " " + key);
if (String.valueOf(value).equals("HashMap")){
fieldNameStr = containsFieldNameStr.replaceAll(FIELD_NAME, s + " " + key);
}
if(String.valueOf(value).equals("ArrayList")){
fieldNameStr = containsFieldNameStr.replaceAll(FIELD_NAME, "List<" + s + "> " + key);
}
fieldList.add(fieldNameStr);
// get构造器
// public 【类型】 get【大写字段名】() { return 【小写字段名】; }
generateGettingAndSetting(gettingAndSettingList, template, key, value, s, GETTING);
// set构造器
// public void set【大写字段名】(【类型】 【小写字段名】) { this.【小写字段名】 = 【小写字段名】; }
generateGettingAndSetting(gettingAndSettingList, template, key, value, s, SETTING);
}
dateString.addAll(fieldList);
dateString.addAll(gettingAndSettingList);
dateString.add("}");
return dateString;
}
/**
* 生成get 和 set 器
* @param gettingAndSettingList get和set的存储List
* @param template 模板
* @param key 字段名
* @param value 字段类型
* @param s 字段类型首字母大写
* @param setting 模板中的get或set
*/
private static void generateGettingAndSetting(List<String> gettingAndSettingList, List<String> template, Object key, Object value, String s, String setting) {
String str5 = getStringByString(template, setting);
String str6 = str5.replaceAll(FIELD_TYPE, String.valueOf(value));
String str7 = str6.replaceAll(BIG, s);
String str8 = str7.replaceAll(MIN, String.valueOf(key));
if (String.valueOf(value).equals("HashMap")){
str5 = getStringByString(template, setting);
str6 = str5.replaceAll(FIELD_TYPE, s);
str7 = str6.replaceAll(BIG, s);
str8 = str7.replaceAll(MIN, String.valueOf(key));
}
if (String.valueOf(value).equals("ArrayList")){
str5 = getStringByString(template, setting);
str6 = str5.replaceAll(FIELD_TYPE, "List<"+s+">");
str7 = str6.replaceAll(BIG, s);
str8 = str7.replaceAll(MIN, String.valueOf(key));
}
gettingAndSettingList.add(str8);
}
/**
* 生成文件
* @param className 文件名
* @param pathName 文件地址
* @param dateString 文件内容
*/
public static void establishFile(String className, String pathName,List<String> dateString){
//System.out.println(dateString);
try {
TestGetTableStructure.createFileAndPathAndWidth(pathName,className+".java",dateString);
}catch (Exception e){
System.out.println("异常了");
}
}
public static File establishFile2(String className, String pathName,List<String> dateString){
File fileAndPathAndWidth2=null;
try {
fileAndPathAndWidth2 = createFileAndPathAndWidth2(pathName, className + ".java", dateString);
}catch (Exception e){
System.out.println("异常了!");
}
return fileAndPathAndWidth2;
}
public static String getStringByString(List<String> template,String type){
String str = "";
for (String s : template) {
if (s.contains(type)){
str = s;
return str;
}
}
return str;
}
public static File createFileAndPathAndWidth2(String directoryPath,String fileName,List<String> dateString) throws Exception{
File file = new File(directoryPath);
if (!file.exists()){
//创建文件夹
if (file.mkdirs()){
System.out.println("创建" + directoryPath + "成功");
} else {
System.out.println("创建" + directoryPath + "失败");
}
}
String filePath = directoryPath + fileName;
System.out.println("filePath::" + filePath);
File file2 = new File(filePath);
if (file2.exists()){
System.out.println("该文件已存在,不能重复创建");
} else {
//创建文件
if (file2.createNewFile()){
System.out.println("文件创建成功");
//写入内容
BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
for (String s : dateString) {
writer.write(s);
writer.write("\n");
}
writer.close();
} else {
System.out.println("文件创建失败");
}
}
return file2;
}
}