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