jsonschema2pojo - 二次封装(基于json内容生成JavaBean代码)

概述

依赖: https://mvnrepository.com/artifact/org.jsonschema2pojo/jsonschema2pojo-core

文档: https://github.com/joelittlejohn/jsonschema2pojo/wiki/Getting-Started

仓库地址: https://github.com/joelittlejohn/jsonschema2pojo

代码

核心代码


pom.xml

<!-- https://mvnrepository.com/artifact/org.jsonschema2pojo/jsonschema2pojo-core -->
<dependency>
    <groupId>org.jsonschema2pojo</groupId>
    <artifactId>jsonschema2pojo-core</artifactId>
    <version>1.1.2</version>
</dependency>



Json2PojoCodeGeneratorConfig.java == 配置类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Json2PojoCodeGeneratorConfig implements CodeGeneratorConfig {

    /**
     * 用于解析成Bean的json内容
     */
    @ApiModelProperty(value = "待解析的json内容(jsonContent)", required = true)
    String jsonContent;

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

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

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

    @Override
    public GenerateCodeTypeEnum generateCodeTypeEnum() {
        return GenerateCodeTypeEnum.JSON2POJO;
    }
}


MyAbstractTypeInfoAwareAnnotator.java == 注解控制配置类

@Setter
@Getter
public class MyAbstractTypeInfoAwareAnnotator extends AbstractTypeInfoAwareAnnotator {

    /**
     * 是否开启使用lombok注解
     */
    boolean lombokAnnotFlag = true;

    /**
     * 是否开启使用swagger注解
     */
    boolean swaggerAnnotFlag = true;

    /**
     * 是否开启使用mybatisplus注解
     */
    boolean mybatisPlusAnnotFlag = true;


    /**
     * 是否开启使用jackson注解
     */
    boolean jacksonAnnotFlag = false;


    public MyAbstractTypeInfoAwareAnnotator(GenerationConfig generationConfig) {
        super(generationConfig);
    }

    @Override
    protected void addJsonTypeInfoAnnotation(JDefinedClass clazz, String propertyName) {
    }

    /**
     * 类上的注解
     */
    @Override
    public void propertyInclusion(JDefinedClass clazz, JsonNode schema) {
        if (lombokAnnotFlag) {
            clazz.annotate(Data.class);
            clazz.annotate(ToString.class).param(LambdaUtil.getMethodName(ToString::callSuper), true);
            clazz.annotate(Builder.class);
            clazz.annotate(NoArgsConstructor.class);
            clazz.annotate(AllArgsConstructor.class);
            clazz.annotate(Accessors.class).param(LambdaUtil.getMethodName(Accessors::chain), true);
        }
        if (mybatisPlusAnnotFlag) {
            clazz.annotate(TableName.class).param(LambdaUtil.getMethodName(TableName::value), StrUtil.toUnderlineCase(clazz.name()));
        }
        if (swaggerAnnotFlag) {
            clazz.annotate(ApiModel.class).param(LambdaUtil.getMethodName(ApiModel::description), clazz.name());
        }

    }


    /**
     * 属性字段上的注解
     */
    @Override
    public void propertyField(JFieldVar field, JDefinedClass clazz, String propertyName, JsonNode propertyNode) {
        if (mybatisPlusAnnotFlag) {
            field.annotate(TableField.class).param("value", StrUtil.toUnderlineCase(propertyName));
        }
        if (swaggerAnnotFlag) {
            field.annotate(ApiModelProperty.class).param("value", propertyName);
        }
        if (jacksonAnnotFlag) {
            field.annotate(JsonProperty.class).param("value", propertyName);
        }
    }
}


MyJsonschema2pojoConfig.java == 注解控制配置类

public class MyJsonschema2pojoConfig {

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

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

            /**
             * 使用json内容进行构建javaBean
             * @return
             */
            @Override
            public SourceType getSourceType() {
                return SourceType.JSON;
            }

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

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


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

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



}


MyCodeWriter.java == 用于获取代码生成结果

public class MyCodeWriter extends CodeWriter {


    private final PrintStream out;

    /**
     * @param os
     *      This stream will be closed at the end of the code generation.
     */
    public MyCodeWriter( OutputStream os ) {
        this.out = new PrintStream(os);;
    }

    @Override
    public OutputStream openBinary(JPackage pkg, String fileName) throws IOException {
        String pkgName = pkg.name();
        if(pkgName.length()!=0)     pkgName += '.';
        return new FilterOutputStream(out) {
            public void close() {
                // don't let this stream close
            }
        };
    }

    @Override
    public void close() throws IOException {
        out.close();
    }
}


Json2PojoCodeGeneratorUtil.java == 静态封装方便使用

public class Json2PojoCodeGeneratorUtil implements CodeGenerator {

    @SneakyThrows
    public static String json2pojo(String jsonContent) {
        return json2pojo(jsonContent, "TestBean", ClassUtil.getPackage(Json2PojoCodeGeneratorUtil.class));
    }

    /**
     * json内容转成Bean代码
     * @param jsonContent json内容
     * @param pojoClassName 生成的Bean的Class名字
     * @param pojoPackageName 生成的Bean的包名字
     * @return
     */
    @SneakyThrows
    public static String json2pojo(String jsonContent, String pojoClassName, String pojoPackageName) {
        return json2pojo(Json2PojoCodeGeneratorConfig.builder()
                .jsonContent(jsonContent)
                .pojoClassName(pojoClassName)
                .pojoPackageName(pojoPackageName)
                .build());
    }

    /**
     * json内容转成Bean代码
     * @param json2PojoGenerateConfig 配置信息
     * @return
     */
    @SneakyThrows
    public static String json2pojo(Json2PojoCodeGeneratorConfig json2PojoGenerateConfig) {
        String jsonContent = json2PojoGenerateConfig.getJsonContent();
        Assert.isTrue(JSONUtil.isTypeJSON(jsonContent), "非JSON内容,请检查");
        String pojoClassName = StrUtil.blankToDefault(json2PojoGenerateConfig.getPojoClassName(), "TestBean");
        String pojoPackageName = StrUtil.blankToDefault(json2PojoGenerateConfig.getPojoPackageName(), ClassUtil.getPackage(Json2PojoCodeGeneratorUtil.class));

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

        //2. 开始生成代码
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        MyCodeWriter myCodeWriter = new MyCodeWriter(byteArrayOutputStream);
        codeModel.build(myCodeWriter);

        //3. 获取结果
        String result = new String(byteArrayOutputStream.toByteArray());

        return StrUtil.trim(result);
    }

    @Override
    public GenerateCodeTypeEnum generateCodeTypeEnum() {
        return GenerateCodeTypeEnum.JSON2POJO;
    }

    @Override
    public String generate(CodeGeneratorConfig generatorConfig) {
        return json2pojo((Json2PojoCodeGeneratorConfig) generatorConfig);
    }
}

测试

Json2PojoCodeUtilTestGenerator.java

class Json2PojoCodeUtilTestGenerator {
    public static String jsonContent = null;
    @BeforeAll
    static void before() {
        LinkInfo linkInfo = LinkInfo.builder().shortLink("fsdfdsfdsf")
                .desc("的方式范德萨范德萨")
                .uuid("fdsfdsfds").build();

        linkInfo.setId(432432l);
        jsonContent = JSONUtil.toJsonStr(linkInfo);
        Console.log(jsonContent);


    }

    @Test
    void json2pojo() {
        String pojoCode = Json2PojoCodeGeneratorUtil.json2pojo(jsonContent);
        Console.log(pojoCode);
    }

    @Test
    void testJson2pojo() {
        String pojoCode = Json2PojoCodeGeneratorUtil.json2pojo(jsonContent,"Test", "work.linruchang.lrcutilsweb.consts");
        Console.log(pojoCode);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZD9sglnf-1664798913277)(en-resource://database/62077:1)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值