protobuf:
项目中用到了protobuf,自己为了方便写的一个工具类,JAVA转proto亦是同理
JAVA代码`
依赖
<!-- protobuf 支持 Java 核心包 注意:这两个依赖的版本要和你本地安装的Protobuf文件的版本一致-->
<!-- 注意:这两个依赖的版本要和你本地安装的Protobuf文件的版本一致-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.9</version>
</dependency>
<!-- proto 与 Json 互转会用到-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.21.9</version>
</dependency>
代码
package com.test.gsepro.proto;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
/**
* @Author: yangzhenhua
* @CreateTime: 2022-12-06 16:04
* @Description: TODO
* @Version: 1.0
*/
public class ProtoJsonMain {
// 项目中用到的基础类
public static List<String> baseTypeList =
Arrays.asList("int", "Integer", "float", "Float", "long", "Long", "double", "Double", "String", "Boolean", "boolean"
, "BigDecimal");
public static void main(String[] args) throws Exception {
// 将JSON 转化成 <名字,<属性名,数据类型>> 的格式
HashMap<String, HashMap<String, String>> totalMap = getTest3();
Map<String, String> fileMap = java2proto(totalMap);
}
private static HashMap<String, HashMap<String, String>> getTest3() {
String s = "你的JSON数据";
JSONObject jsonObject = JSONObject.parseObject(s);
HashMap<String, HashMap<String, String>> hashMap = new HashMap<>();
JSONObject data = jsonObject.getJSONObject("data");
getMessageFile("data", data, hashMap);
Set<Map.Entry<String, HashMap<String, String>>> entries = hashMap.entrySet();
for (Map.Entry<String, HashMap<String, String>> entry : entries) {
System.out.println("dto Name :" + entry.getKey());
HashMap<String, String> value = entry.getValue();
for (Map.Entry<String, String> stringStringEntry : value.entrySet()) {
System.out.println(stringStringEntry.getKey() + ":" + stringStringEntry.getValue());
}
// System.out.println("=============");
}
// System.out.println(hashMap);
return hashMap;
}
private static void getMessageFile(String name, JSONObject data, HashMap<String, HashMap<String, String>> hashMap) {
// 判断是否存在
if (!hashMap.containsKey(name)) {
HashMap<String, String> childrenMap = new HashMap<>();
Set<Map.Entry<String, Object>> entries = data.entrySet();
for (Map.Entry<String, Object> entry : entries) {
Class<?> aClass = entry.getValue().getClass();
childrenMap.put(entry.getKey(), aClass.getSimpleName());
if (aClass.getSimpleName().equals("JSONArray")) {
// 获取第一个
JSONArray jsonArray = JSONArray.parseArray(entry.getValue().toString());
if (jsonArray.size() > 0) {
JSONObject chilObject = jsonArray.getJSONObject(0);
getMessageFile(entry.getKey(), chilObject, hashMap);
}
}
}
hashMap.put(name, childrenMap);
}
}
public static Map<String, String> java2proto(HashMap<String, HashMap<String, String>> totalMap) {
Map<String, String> resultMap = new HashMap<>();
String fileString = "";
Set<Map.Entry<String, HashMap<String, String>>> entries = totalMap.entrySet();
for (Map.Entry<String, HashMap<String, String>> entry : entries) {
int i = 1;
StringBuilder b = new StringBuilder();
String simpleName = entry.getKey();
HashMap<String, String> fieldMap = entry.getValue();
HashSet<String> importSet = new HashSet<>();
b.append("message ").append(simpleName).append("{").append("\n");
Set<Map.Entry<String, String>> fieldentries = fieldMap.entrySet();
for (Map.Entry<String, String> fieldentry : fieldentries) {
String name = fieldentry.getKey();
String type = fieldentry.getValue();
b.append(" ");
type = type.substring(type.lastIndexOf(".") + 1);
if ("String".equalsIgnoreCase(type)) {
b.append("string");
} else if ("Double".equalsIgnoreCase(type) || "BigDecimal".equalsIgnoreCase(type)) {
b.append("double");
} else if ("Date".equalsIgnoreCase(type)) {
b.append("string");
} else if ("Long".equalsIgnoreCase(type) || "long".equalsIgnoreCase(type)) {
b.append("int64");
} else if ("Integer".equalsIgnoreCase(type) || "Byte".equalsIgnoreCase(type)) {
b.append("int32");
} else if ("JSONArray".equalsIgnoreCase(type)) {
// list引用类型
b.append("repeated ");
// 获取泛型的 属性
String listTypeName = name;
}
b.append(" ").append(name).append(" ").append("=").append(" ").append(i++).append(";");
b.append("\n");
}
b.append("}");
b.append("\n");
System.out.println("======");
System.out.println(b.toString());
}
return resultMap;
}
/**
* 获取该泛型的属性
*
* @param field
* @return
*/
private static String getListTypeName(Field field) {
// 获取泛型的 属性
Type genericType = field.getGenericType();
if (genericType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) genericType;
//得到泛型里的class类型对象
Class<?> genericClazz = (Class<?>) pt.getActualTypeArguments()[0];
return genericClazz.getTypeName();
}
return "";
}
public static List<Class> getJavaDtoClass(Class value, List<Class> classeList) {
String name = value.getTypeName();
try {
// 基本类型 list
Field[] fields = value.getDeclaredFields();
classeList.add(Class.forName(name));
for (Field field : fields) {
name = field.getType().getName();
String simpleName = field.getType().getSimpleName();
if ("List".equals(simpleName)) {
//集合获取泛型
name = getListTypeName(field);
simpleName = name.substring(name.lastIndexOf(".") + 1);
}
// 非基本类型添加
if (!baseTypeList.contains(simpleName)) {
// 已有的不添加
if (!classeList.contains(Class.forName(name))) {
// 递归添加 所有属性
getJavaDtoClass(Class.forName(name), classeList);
}
}
}
} catch (Error error) {
System.out.println("error 报错名称" + name);
} catch (Exception e) {
e.printStackTrace();
System.out.println("exception 报错名称" + name);
}
return classeList;
}
/**
* 获取 文件头部
*
* @param packageName
* @param fileName
* @param importSet
* @return
*/
private static String getProtoHeadString(String packageName, String fileName, Set<String> importSet) {
StringJoiner sj = new StringJoiner("\n");
sj.add("//使用 proto3 语法 ,未指定则使用proto2");
sj.add("syntax = \"proto3\";");
sj.add("");
sj.add("// proto 文件包名");
sj.add("package " + packageName + ";");
sj.add("");
sj.add("//生成 proto 的文件名");
sj.add("option java_outer_classname=\"" + fileName + "Proto\";");
sj.add("");
if (importSet.size() > 0) {
sj.add("// 引入外部的 proto 对象");
for (String importName : importSet) {
sj.add("import " + "\"" + importName + ".proto" + "\"" + ";");
}
}
sj.add("");
sj.add("");
return sj.toString();
}
}