从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 {@SneakyThrowspublic static File json2pojoFile(String jsonContent) {return json2pojoFile(jsonContent, "TestBean", ClassUtil.getPackage(Json2PojoCodeGeneratorUtil.class));}@SneakyThrowspublic static File json2pojoFile(String jsonContent, String pojoClassName, String pojoPackageName) {return json2pojoFile(Json2PojoCodeGeneratorConfig.builder().jsonContent(jsonContent).pojoClassName(pojoClassName).pojoPackageName(pojoPackageName).build());}/*** json内容转成Bean代码 生成文件夹** @param json2PojoGenerateConfig 配置信息*/@SneakyThrowspublic 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() {@Overridepublic boolean isIncludeAllPropertiesConstructor() {return false;}@Overridepublic SourceType getSourceType() {return SourceType.JSONSCHEMA;}@Overridepublic boolean isGenerateBuilders() { // set config option by overriding methodreturn false;}@Overridepublic AnnotationStyle getAnnotationStyle() {return AnnotationStyle.NONE;}@Overridepublic boolean isIncludeAdditionalProperties() {return false;}@Overridepublic boolean isIncludeGetters() {return includeGetAndSetFlag;}@Overridepublic boolean isIncludeSetters() {return includeGetAndSetFlag;}@Overridepublic boolean isIncludeToString() {return false;}@Overridepublic boolean isSerializable() {return true;}@Overridepublic boolean isIncludeGeneratedAnnotation() {return false;}@Overridepublic boolean isIncludeHashcodeAndEquals() {return false;}@Overridepublic String getTargetVersion() {return "1.8";}@Overridepublic 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);}}