根据微信返回的JSON生成 JavaBean

引入pom.xml

xml 复制代码
		<!--velocity代码生成使用模板 -->
		<dependency>
			<groupId>org.apache.velocity</groupId>
			<artifactId>velocity</artifactId>
			<version>1.7</version>
		</dependency>
		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-json</artifactId>
            <version>5.8.20</version>
        </dependency>

WxJavaBean

java 复制代码
import lombok.Data;
import java.util.List;

@Data
public class WxJavaBean {
    private String className;
    private String path;
    private List<WxField> fields;
}

WxField

java 复制代码
import lombok.Data;
@Data
public class WxField {
    private String path;
    private Integer type;
    private String jsonName;
    private String javaName;

}

java

java 复制代码
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.io.StringWriter;
import java.util.*;

public class AA {
    public static void main(String[] args) {
        String vmPathPre="D:\\xxxx\";
        String vmPathSfx="vm-local\\wx-java\\bean.java.vm";
        String packageName="com.xxx.wechat.dto.order.detail.rsp";
        String fileName="D:\\xxxxxx\\src\\main\\java\\wechat\\dto\\order\\detail\\rsp";
 			//微信返回的json
        String s="{}";
        String baseNameDTO="OrderDetailDTO";

        List<WxJavaBean> javaBeanFiles = new ArrayList<>();
        Stack<String>  fileNameStack = new Stack<>();
//        fileNameStack.push("OrderDetail");
        JSONObject jsonObject =null;
        JSON parse = JSONUtil.parse(s);
        String nowKeyPath=null;
        do{
            String pop = fileNameStack.isEmpty()?baseNameDTO: fileNameStack.pop();
//            System.out.println(pop);
            if(null==nowKeyPath && fileNameStack.isEmpty()){
                nowKeyPath="";
            }else {
                nowKeyPath=pop+".";
            }
            if(null==jsonObject){
                jsonObject = JSONUtil.parseObj(s);
            }else {
                String byPath = parse.getByPath(pop).toString();
                int i = byPath.indexOf("{");
                int length = byPath.length();
//                System.out.println("byPath  >> " + byPath);
                String subStr = StrUtil.sub(byPath, i, length - i);
//                System.out.println("subStr  >> " + subStr);
                try {
                    jsonObject =JSONUtil.parseObj(subStr);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            List<WxField> ll = new ArrayList<>();
            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
                WxField wxField = new WxField();
                String key = entry.getKey();
                wxField.setPath(key);
                String keyName=key;
                if(keyName.contains(".")){
                    int i = key.lastIndexOf(".");
                    keyName  = key.substring(i);
                }
                wxField.setJsonName(keyName);
                wxField.setJavaName(StrUtil.toCamelCase(keyName));
                Object value = entry.getValue();
                if(value instanceof Integer){
                    wxField.setType(0);
                } else if(value instanceof String){
                    wxField.setType(1);
                } else if(value instanceof Boolean){
                    wxField.setType(2);
                }else {
                    wxField.setType(3);
//                    System.out.println("push >>> "+nowKeyPath+key);
                    fileNameStack.push(nowKeyPath+key);
                }
                ll.add(wxField);
            }
            WxJavaBean wxJavaBean = new WxJavaBean();
            wxJavaBean.setPath(pop);
            String keyName=pop;
            if(keyName.contains(".")){
                int i = pop.lastIndexOf(".");
                keyName  = pop.substring(i+1);
            }

wxJavaBean.setClassName(StrUtil.upperFirst(StrUtil.toCamelCase(keyName) ));
            wxJavaBean.setFields(ll);
            javaBeanFiles.add(wxJavaBean);
//            System.out.println(ll);
        }while (!fileNameStack.empty());

            Properties p = new Properties();
            // 加载classpath目录下的vm文件
            p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH,vmPathPre);
            // 定义字符集
            p.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
            p.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
            // 初始化Velocity引擎,指定配置Properties
            Velocity.init(p);

        for (WxJavaBean javaBeanFile : javaBeanFiles) {
            System.out.println(String.format("key >>> %s  ,  size >>> %d ",javaBeanFile.getPath(),javaBeanFile.getFields().size()) );
            List<WxField> fields = javaBeanFile.getFields();
            // 渲染模板
            StringWriter sw = new StringWriter();
            Template tpl = Velocity.getTemplate(vmPathSfx, "UTF-8");
            VelocityContext velocityContext = new VelocityContext();
            velocityContext.put("randomUID", RandomUtil.randomInt());
            velocityContext.put("fields",fields);
            velocityContext.put("ClassName",javaBeanFile.getClassName());
            velocityContext.put("packageName",packageName);
            tpl.merge(velocityContext, sw);
            FileUtil.writeUtf8String(sw.toString(),fileName+"\\"+javaBeanFile.getClassName()+".java");
//            System.out.println(sw.toString());

        }

    }
}
java 复制代码
import lombok.Data;
import java.util.List;

@Data
public class WxJavaBean {
    private String className;
    private String path;
    private List<WxField> fields;
}

bean.java.vm

java 复制代码
package ${packageName};

import cn.hutool.core.annotation.Alias;
import lombok.Data;
import java.io.Serializable;
import java.util.List;

@Data
public class ${ClassName} implements Serializable {

    private static final long serialVersionUID = ${randomUID}L;
#foreach ($column in $fields)
    @Alias("$column.jsonName")
    private #if($column.type == 0
)Integer#elseif($column.type == 1
)String#elseif($column.type == 2
)Boolean#elseif($column.type == 3
)#set($AttrName=$column.javaName.substring(0,1).toUpperCase() + ${column.javaName.substring(1)}
)List<$AttrName>#end $column.javaName;
#end

}
相关推荐
Json_181790144808 小时前
商品详情接口使用方法和对接流程如下
大数据·json
ZhongruiRao1 天前
Springboot+PostgreSQL+MybatisPlus存储JSON或List、数组(Array)数据
spring boot·postgresql·json
华农第一蒟蒻1 天前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
胡耀超1 天前
知识图谱入门——8: KG开发常见数据格式:OWL、RDF、XML、GraphML、JSON、CSV。
xml·json·知识图谱·csv·owl·graphml·gml
qtj-0011 天前
普通人在刚开始做副业时要注意哪些细节?
大数据·微信·新媒体运营·创业创新
小杨互联网1 天前
微信第三方开放平台接入本地消息事件接口报错问题java.security.InvalidKeyException: Illegal key size
微信·微信公众号·微信第三方开放平台·第三方开放平台接入
a6953188_1 天前
如何评估一个副业项目的可行性?
大数据·微信·创业创新
x-cmd2 天前
[241005] 14 款最佳免费开源图像处理库 | PostgreSQL 17 正式发布
数据库·图像处理·sql·安全·postgresql·开源·json
先知demons2 天前
js将对象的键和值分别归纳进对象,并将多层对象转化成数据的方法
javascript·vue.js·json
Midsummer啦啦啦2 天前
Python字符串转JSON格式指南
开发语言·python·json