概述
依赖: 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);
}
}