schema2java-jsonschema2pojo使用

发布于:2024-05-10 ⋅ 阅读:(26) ⋅ 点赞:(0)

从Schema生成代码:https://github.com/joelittlejohn/jsonschema2pojo
https://github.com/frx08/jsonschema2popo
https://www.libhunt.com/compare-jsonschema2pojo-vs-mvn-golang

请教了大佬的文档:jsonschema2pojo - 二次封装(基于json内容生成JavaBean代码)-CSDN博客

引入依赖

<dependency>
   <groupId>org.jsonschema2pojo</groupId>
   <artifactId>jsonschema2pojo-core</artifactId>
   <version>1.1.1</version>
</dependency>

代码开发

工具类



import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.StrUtil;
import Json2PojoCodeGeneratorConfig;
import Jsonschema2pojoConfig;
import com.sun.codemodel.JCodeModel;
import lombok.SneakyThrows;
import org.jsonschema2pojo.SchemaMapper;

import java.io.File;
import java.nio.file.Files;

/**
 * 静态封装方便使用
 */
public class Json2PojoCodeGeneratorUtil {
    @SneakyThrows
    public static File json2pojoFile(String jsonContent) {
        return json2pojoFile(jsonContent, "TestBean", ClassUtil.getPackage(Json2PojoCodeGeneratorUtil.class));
    }

    @SneakyThrows
    public static File json2pojoFile(String jsonContent, String pojoClassName, String pojoPackageName) {
        return json2pojoFile(Json2PojoCodeGeneratorConfig.builder()
                .jsonContent(jsonContent)
                .pojoClassName(pojoClassName)
                .pojoPackageName(pojoPackageName)
                .build());
    }

    /**
     * json内容转成Bean代码 生成文件夹
     *
     * @param json2PojoGenerateConfig 配置信息
     */
    @SneakyThrows
    public static File json2pojoFile(Json2PojoCodeGeneratorConfig json2PojoGenerateConfig) {
        String jsonContent = json2PojoGenerateConfig.getJsonContent();
        String pojoClassName = StrUtil.blankToDefault(json2PojoGenerateConfig.getPojoClassName(), "TestBean");
        String pojoPackageName = StrUtil.blankToDefault(json2PojoGenerateConfig.getPojoPackageName(), ClassUtil.getPackage(Json2PojoCodeGeneratorUtil.class));

        // 1. 生成配置设置
        SchemaMapper mapper = Jsonschema2pojoConfig.getDefaultSchemaMapper();
        JCodeModel codeModel = new JCodeModel();
        mapper.generate(codeModel, pojoClassName, pojoPackageName, jsonContent);

        // 2. 开始生成代码
        File required = Files.createTempDirectory("required").toFile();
        codeModel.build(required);

        // 3. 生成压缩文件
        return required;
    }
}

pojo代码生成配置类


import cn.hutool.core.util.URLUtil;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 配置类
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Json2PojoCodeGeneratorConfig {

    /**
     * 用于解析成Bean的json内容
     * 待解析的json内容(jsonContent)
     */
    String jsonContent;

    /**
     * 结果Bean的类名
     * 不设置则为【TestBean】
     * 生成的Bean的类名(pojoClassName)
     */
    String pojoClassName;

    /**
     * 结果Bean的包名
     * 不设置则使用工具类默认包名
     * 生成的Bean的报名(pojoPackageName)
     */
    String pojoPackageName;

    /**
     * 解码
     */
    public void setJsonContent(String jsonContent) {
        this.jsonContent = URLUtil.decode(jsonContent);
    }
}

pojo注解生成配置类



import org.jsonschema2pojo.AnnotationStyle;
import org.jsonschema2pojo.DefaultGenerationConfig;
import org.jsonschema2pojo.GenerationConfig;
import org.jsonschema2pojo.InclusionLevel;
import org.jsonschema2pojo.SchemaGenerator;
import org.jsonschema2pojo.SchemaMapper;
import org.jsonschema2pojo.SchemaStore;
import org.jsonschema2pojo.SourceType;
import org.jsonschema2pojo.rules.RuleFactory;

/**
 * 注解控制配置类
 */
public class Jsonschema2pojoConfig {

    /**
     * 总体配置
     *
     * @param includeGetAndSetFlag 是否需要get\set代码
     */
    public static GenerationConfig getGenerationConfig(boolean includeGetAndSetFlag) {
        return new DefaultGenerationConfig() {
            @Override
            public boolean isIncludeAllPropertiesConstructor() {
                return false;
            }

            @Override
            public SourceType getSourceType() {
                return SourceType.JSONSCHEMA;
            }

            @Override
            public boolean isGenerateBuilders() { // set config option by overriding method
                return false;
            }

            @Override
            public AnnotationStyle getAnnotationStyle() {
                return AnnotationStyle.NONE;
            }

            @Override
            public boolean isIncludeAdditionalProperties() {
                return false;
            }

            @Override
            public boolean isIncludeGetters() {
                return includeGetAndSetFlag;
            }

            @Override
            public boolean isIncludeSetters() {
                return includeGetAndSetFlag;
            }

            @Override
            public boolean isIncludeToString() {
                return false;
            }

            @Override
            public boolean isSerializable() {
                return true;
            }

            @Override
            public boolean isIncludeGeneratedAnnotation() {
                return false;
            }

            @Override
            public boolean isIncludeHashcodeAndEquals() {
                return false;
            }

            @Override
            public String getTargetVersion() {
                return "1.8";
            }

            @Override
            public InclusionLevel getInclusionLevel() {
                return InclusionLevel.ALWAYS;
            }
        };
    }

    public static GenerationConfig getGenerationConfig() {
        return getGenerationConfig(false);
    }

    /**
     * 生成的注解配置
     */
    public static AbstractTypeInfoAwareAnnotator getAnnotator(GenerationConfig generationConfig) {
        return new AbstractTypeInfoAwareAnnotator(generationConfig);
    }


    /**
     * 自定义总体配置+注解配置
     */
    public static SchemaMapper getSchemaMapper(GenerationConfig config, AbstractTypeInfoAwareAnnotator myAbstractTypeInfoAwareAn) {
        return new SchemaMapper(new RuleFactory(config, myAbstractTypeInfoAwareAn, new SchemaStore()), new SchemaGenerator());
    }

    /**
     * 默认总体配置+注解配置
     */
    public static SchemaMapper getDefaultSchemaMapper() {
        GenerationConfig generationConfig = getGenerationConfig();
        AbstractTypeInfoAwareAnnotator annotator = getAnnotator(generationConfig);
        return getSchemaMapper(generationConfig, annotator);
    }


}