protobuf:JSON转protobuf文件工具类

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();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值