diff --git a/json-modules/json-2/pom.xml b/json-modules/json-2/pom.xml
index 82fe689ebf..7253088516 100644
--- a/json-modules/json-2/pom.xml
+++ b/json-modules/json-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
json-2
0.0.1-SNAPSHOT
@@ -123,6 +123,26 @@
javax.annotation-api
1.3.2
+
+ com.github.victools
+ jsonschema-generator
+ ${jsonschema-generator.version}
+
+
+ com.github.victools
+ jsonschema-module-jackson
+ ${jsonschema-generator.version}
+
+
+ jakarta.validation
+ jakarta.validation-api
+ ${jakarta.validation.version}
+
+
+ com.github.victools
+ jsonschema-module-jakarta-validation
+ ${jsonschema-generator.version}
+
@@ -162,6 +182,55 @@
+
+
+ com.github.victools
+ jsonschema-maven-plugin
+ ${jsonschema-generator.version}
+
+
+
+ generate
+
+
+
+
+
+ com.baeldung.jsonschemageneration.plugin
+
+
+ com.baeldung.jsonschemageneration.plugin.Person
+
+ DRAFT_2020_12
+ src/main/resources/schemas
+ {1}/{0}.json
+ true
+
+ PLAIN_JSON
+
+
+
+
+ SCHEMA_VERSION_INDICATOR
+
+
+
+ Jackson
+
+
+
+
+
+ JakartaValidation
+
+
+
+
+
+
+
+
+
@@ -173,6 +242,8 @@
0.1.1
0.4.2
0.13.0
+ 4.31.1
+ 3.0.2
\ No newline at end of file
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AdvancedArticle.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AdvancedArticle.java
new file mode 100644
index 0000000000..07e00bba0f
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AdvancedArticle.java
@@ -0,0 +1,70 @@
+package com.baeldung.jsonschemageneration.configuration;
+
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.UUID;
+
+enum Area {
+ JAVA("JAVA"), KOTLIN("KOTLIN"), SCALA("SCALA"), LINUX("LINUX");
+
+ private final String area;
+
+ Area(String area) {
+ this.area = area;
+ }
+
+ public String getArea() {
+ return area;
+ }
+}
+
+public class AdvancedArticle {
+ private UUID id;
+ private String title;
+
+ private String content;
+
+ @AllowedTypes({ Timestamp.class, Date.class })
+ private Object createdAt;
+ private Area area;
+
+ public Area getArea() {
+ return area;
+ }
+
+ public void setArea(Area area) {
+ this.area = area;
+ }
+
+ public Object getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Object createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AdvancedConfigurationSchemaGenerator.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AdvancedConfigurationSchemaGenerator.java
new file mode 100644
index 0000000000..3fbf6bac6e
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AdvancedConfigurationSchemaGenerator.java
@@ -0,0 +1,39 @@
+package com.baeldung.jsonschemageneration.configuration;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.victools.jsonschema.generator.Option;
+import com.github.victools.jsonschema.generator.OptionPreset;
+import com.github.victools.jsonschema.generator.SchemaGenerator;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfig;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
+import com.github.victools.jsonschema.generator.SchemaVersion;
+
+import java.util.Optional;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class AdvancedConfigurationSchemaGenerator {
+ public static void main(String[] args) {
+
+ SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON);
+
+ configBuilder.forFields().withInstanceAttributeOverride((node, field, context) -> node.put("readOnly", field.getDeclaredType().isInstanceOf(UUID.class)));
+
+ configBuilder.forFields()
+ .withTargetTypeOverridesResolver(field -> Optional.ofNullable(field.getAnnotationConsideringFieldAndGetterIfSupported(AllowedTypes.class))
+ .map(AllowedTypes::value)
+ .map(Stream::of)
+ .map(stream -> stream.map(subtype -> field.getContext().resolve(subtype)))
+ .map(stream -> stream.collect(Collectors.toList()))
+ .orElse(null));
+
+ SchemaGeneratorConfig config = configBuilder.with(Option.EXTRA_OPEN_API_FORMAT_VALUES).build();
+
+ SchemaGenerator generator = new SchemaGenerator(config);
+ JsonNode jsonSchema = generator.generateSchema(AdvancedArticle.class);
+
+ System.out.println(jsonSchema.toPrettyString());
+ }
+
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AllowedTypes.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AllowedTypes.java
new file mode 100644
index 0000000000..9c2ae2780d
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/AllowedTypes.java
@@ -0,0 +1,13 @@
+package com.baeldung.jsonschemageneration.configuration;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface AllowedTypes {
+ Class>[] value();
+}
+
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/IndividualConfigurationSchemaGenerator.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/IndividualConfigurationSchemaGenerator.java
new file mode 100644
index 0000000000..3e1b556311
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/configuration/IndividualConfigurationSchemaGenerator.java
@@ -0,0 +1,44 @@
+package com.baeldung.jsonschemageneration.configuration;
+
+import com.baeldung.jsonschemageneration.recursive.Author;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.victools.jsonschema.generator.Option;
+import com.github.victools.jsonschema.generator.OptionPreset;
+import com.github.victools.jsonschema.generator.SchemaGenerator;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfig;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
+import com.github.victools.jsonschema.generator.SchemaVersion;
+
+import javax.annotation.Nullable;
+import javax.validation.constraints.NotNull;
+import java.time.Instant;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class IndividualConfigurationSchemaGenerator {
+ public static void main(String[] args) {
+
+ SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON);
+
+ configBuilder.forFields().withRequiredCheck(field -> field.getAnnotationConsideringFieldAndGetter(Nullable.class) == null).withArrayUniqueItemsResolver(scope -> scope.getType().getErasedType() == (List.class) ? true : null);
+
+ configBuilder.forMethods().withRequiredCheck(method -> method.getAnnotationConsideringFieldAndGetter(NotNull.class) != null);
+
+ configBuilder.forTypesInGeneral()
+ .withArrayUniqueItemsResolver(scope -> scope.getType().getErasedType() == (List.class) ? true : null)
+ .withDefaultResolver(scope -> scope.getType().getErasedType() == List.class ? Collections.EMPTY_LIST : null)
+ .withDefaultResolver(scope -> scope.getType().getErasedType() == Date.class ? Date.from(Instant.now()) : null)
+ .withEnumResolver(scope -> scope.getType().getErasedType().isEnum() ? Stream.of(scope.getType().getErasedType().getEnumConstants()).map(v -> ((Enum>) v).name()).collect(Collectors.toList()) : null);
+
+ SchemaGeneratorConfig config = configBuilder.with(Option.EXTRA_OPEN_API_FORMAT_VALUES).build();
+
+ SchemaGenerator generator = new SchemaGenerator(config);
+ JsonNode jsonSchema = generator.generateSchema(Author.class);
+
+ System.out.println(jsonSchema.toPrettyString());
+ }
+
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/modules/JacksonModuleSchemaGenerator.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/modules/JacksonModuleSchemaGenerator.java
new file mode 100644
index 0000000000..eda5015400
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/modules/JacksonModuleSchemaGenerator.java
@@ -0,0 +1,68 @@
+package com.baeldung.jsonschemageneration.modules;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.victools.jsonschema.generator.SchemaGenerator;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
+import com.github.victools.jsonschema.module.jackson.JacksonModule;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import static com.github.victools.jsonschema.generator.Option.EXTRA_OPEN_API_FORMAT_VALUES;
+import static com.github.victools.jsonschema.generator.OptionPreset.PLAIN_JSON;
+import static com.github.victools.jsonschema.generator.SchemaVersion.DRAFT_2020_12;
+import static com.github.victools.jsonschema.module.jackson.JacksonOption.RESPECT_JSONPROPERTY_REQUIRED;
+
+public class JacksonModuleSchemaGenerator {
+ public static void main(String[] args) {
+
+ JacksonModule module = new JacksonModule(RESPECT_JSONPROPERTY_REQUIRED);
+ SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(DRAFT_2020_12, PLAIN_JSON).with(module).with(EXTRA_OPEN_API_FORMAT_VALUES);
+
+ SchemaGenerator generator = new SchemaGenerator(configBuilder.build());
+ JsonNode jsonSchema = generator.generateSchema(Person.class);
+
+ System.out.println(jsonSchema.toPrettyString());
+ }
+
+ static class Person {
+
+ @JsonProperty(access = JsonProperty.Access.READ_ONLY)
+ UUID id;
+
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE, required = true)
+ String name;
+
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE, required = true)
+ String surname;
+
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE, required = true)
+ Address address;
+
+ @JsonIgnore
+ String fullName;
+
+ @JsonProperty(access = JsonProperty.Access.READ_ONLY)
+ Date createdAt;
+
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE)
+ List friends;
+
+ }
+
+ static class Address {
+
+ @JsonProperty()
+ String street;
+
+ @JsonProperty(required = true)
+ String city;
+
+ @JsonProperty(required = true)
+ String country;
+ }
+
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/modules/JakartaValidationModuleSchemaGenerator.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/modules/JakartaValidationModuleSchemaGenerator.java
new file mode 100644
index 0000000000..ca19d35357
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/modules/JakartaValidationModuleSchemaGenerator.java
@@ -0,0 +1,63 @@
+package com.baeldung.jsonschemageneration.modules;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.victools.jsonschema.generator.SchemaGenerator;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
+import com.github.victools.jsonschema.module.jakarta.validation.JakartaValidationModule;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Null;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import static com.github.victools.jsonschema.generator.OptionPreset.PLAIN_JSON;
+import static com.github.victools.jsonschema.generator.SchemaVersion.DRAFT_2020_12;
+import static com.github.victools.jsonschema.module.jakarta.validation.JakartaValidationOption.INCLUDE_PATTERN_EXPRESSIONS;
+import static com.github.victools.jsonschema.module.jakarta.validation.JakartaValidationOption.NOT_NULLABLE_FIELD_IS_REQUIRED;
+
+public class JakartaValidationModuleSchemaGenerator {
+ public static void main(String[] args) {
+
+ JakartaValidationModule module = new JakartaValidationModule(NOT_NULLABLE_FIELD_IS_REQUIRED, INCLUDE_PATTERN_EXPRESSIONS);
+ SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(DRAFT_2020_12, PLAIN_JSON).with(module);
+
+ SchemaGenerator generator = new SchemaGenerator(configBuilder.build());
+ JsonNode jsonSchema = generator.generateSchema(Person.class);
+
+ System.out.println(jsonSchema.toPrettyString());
+ }
+
+ static class Person {
+
+ @NotNull UUID id;
+
+ @NotNull String name;
+
+ @NotNull @Email @Pattern(regexp = "\\b[A-Za-z0-9._%+-]+@baeldung\\.com\\b") String email;
+
+ @NotNull String surname;
+
+ @NotNull Address address;
+
+ @Null String fullName;
+
+ @NotNull Date createdAt;
+
+ @Size(max = 10) List friends;
+
+ }
+
+ static class Address {
+
+ @Null String street;
+
+ @NotNull String city;
+
+ @NotNull String country;
+ }
+
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/plugin/Person.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/plugin/Person.java
new file mode 100644
index 0000000000..f87dcd5981
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/plugin/Person.java
@@ -0,0 +1,61 @@
+package com.baeldung.jsonschemageneration.plugin;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Null;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+public class Person {
+
+ @NotNull
+ @JsonProperty(access = JsonProperty.Access.READ_ONLY)
+ UUID id;
+
+ @NotNull
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE, required = true)
+ String name;
+
+ @NotNull
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE, required = true)
+ @Email @Pattern(regexp = "\\b[A-Za-z0-9._%+-]+@baeldung\\.com\\b") String email;
+
+ @NotNull
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE, required = true)
+
+ String surname;
+
+ @NotNull
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE, required = true)
+ Address address;
+
+ @Null String fullName;
+
+ @JsonProperty(access = JsonProperty.Access.READ_ONLY)
+ Date createdAt;
+
+ @Size(max = 10)
+ @JsonProperty(access = JsonProperty.Access.READ_WRITE)
+ List friends;
+
+}
+
+class Address {
+
+ @Null
+ @JsonProperty
+ String street;
+
+ @NotNull
+ @JsonProperty(required = true)
+ String city;
+
+ @NotNull
+ @JsonProperty(required = true)
+ String country;
+}
\ No newline at end of file
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/Author.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/Author.java
new file mode 100644
index 0000000000..a19afb3f6f
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/Author.java
@@ -0,0 +1,12 @@
+package com.baeldung.jsonschemageneration.recursive;
+
+import java.util.List;
+import java.util.UUID;
+
+public class Author {
+ private UUID id;
+ private String name;
+ private String role;
+
+ private List articles;
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/AuthoredArticle.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/AuthoredArticle.java
new file mode 100644
index 0000000000..3ab7464aaf
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/AuthoredArticle.java
@@ -0,0 +1,68 @@
+package com.baeldung.jsonschemageneration.recursive;
+
+import java.util.Date;
+import java.util.UUID;
+
+enum Area {
+ JAVA("JAVA"), KOTLIN("KOTLIN"), SCALA("SCALA"), LINUX("LINUX");
+
+ private final String area;
+
+ Area(String area) {
+ this.area = area;
+ }
+
+ public String getArea() {
+ return area;
+ }
+}
+
+public class AuthoredArticle {
+ private UUID id;
+ private String title;
+ private String content;
+ private Date createdAt;
+ private Area area;
+
+ private Author author;
+
+ public Area getArea() {
+ return area;
+ }
+
+ public void setArea(Area area) {
+ this.area = area;
+ }
+
+ public Date getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Date createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/RecursiveSchemaGenerator.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/RecursiveSchemaGenerator.java
new file mode 100644
index 0000000000..2047dac53f
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/recursive/RecursiveSchemaGenerator.java
@@ -0,0 +1,23 @@
+package com.baeldung.jsonschemageneration.recursive;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.victools.jsonschema.generator.Option;
+import com.github.victools.jsonschema.generator.OptionPreset;
+import com.github.victools.jsonschema.generator.SchemaGenerator;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfig;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
+import com.github.victools.jsonschema.generator.SchemaVersion;
+
+public class RecursiveSchemaGenerator {
+ public static void main(String[] args) {
+
+ SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON);
+ SchemaGeneratorConfig config = configBuilder.with(Option.EXTRA_OPEN_API_FORMAT_VALUES).without(Option.FLATTENED_ENUMS_FROM_TOSTRING).build();
+
+ SchemaGenerator generator = new SchemaGenerator(config);
+ JsonNode jsonSchema = generator.generateSchema(AuthoredArticle.class);
+
+ System.out.println(jsonSchema.toPrettyString());
+ }
+
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/simple/Article.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/simple/Article.java
new file mode 100644
index 0000000000..480dc2e425
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/simple/Article.java
@@ -0,0 +1,66 @@
+package com.baeldung.jsonschemageneration.simple;
+
+import java.util.Date;
+import java.util.UUID;
+
+enum Area {
+ JAVA("JAVA"), KOTLIN("KOTLIN"), SCALA("SCALA"), LINUX("LINUX");
+
+ private final String area;
+
+ Area(String area) {
+ this.area = area;
+ }
+
+ public String getArea() {
+ return area;
+ }
+}
+
+public class Article {
+ private UUID id;
+ private String title;
+ private String content;
+ private Date createdAt;
+ private Area area;
+
+ public Area getArea() {
+ return area;
+ }
+
+ public void setArea(Area area) {
+ this.area = area;
+ }
+
+ public Date getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Date createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+}
diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/simple/SimpleSchemaGenerator.java b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/simple/SimpleSchemaGenerator.java
new file mode 100644
index 0000000000..daea643b1b
--- /dev/null
+++ b/json-modules/json-2/src/main/java/com/baeldung/jsonschemageneration/simple/SimpleSchemaGenerator.java
@@ -0,0 +1,23 @@
+package com.baeldung.jsonschemageneration.simple;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.victools.jsonschema.generator.Option;
+import com.github.victools.jsonschema.generator.OptionPreset;
+import com.github.victools.jsonschema.generator.SchemaGenerator;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfig;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
+import com.github.victools.jsonschema.generator.SchemaVersion;
+
+public class SimpleSchemaGenerator {
+ public static void main(String[] args) {
+
+ SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON);
+ SchemaGeneratorConfig config = configBuilder.with(Option.EXTRA_OPEN_API_FORMAT_VALUES).without(Option.FLATTENED_ENUMS_FROM_TOSTRING).build();
+
+ SchemaGenerator generator = new SchemaGenerator(config);
+ JsonNode jsonSchema = generator.generateSchema(Article.class);
+
+ System.out.println(jsonSchema.toPrettyString());
+ }
+
+}
diff --git a/json-modules/json-2/src/main/resources/schemas/com/baeldung/jsonschemageneration/plugin/Person.json b/json-modules/json-2/src/main/resources/schemas/com/baeldung/jsonschemageneration/plugin/Person.json
new file mode 100644
index 0000000000..d52a527684
--- /dev/null
+++ b/json-modules/json-2/src/main/resources/schemas/com/baeldung/jsonschemageneration/plugin/Person.json
@@ -0,0 +1,54 @@
+{
+ "$defs" : {
+ "Address" : {
+ "type" : "object",
+ "properties" : {
+ "city" : {
+ "type" : "string"
+ },
+ "country" : {
+ "type" : "string"
+ },
+ "street" : {
+ "type" : [ "string", "null" ]
+ }
+ },
+ "required" : [ "city", "country" ],
+ "additionalProperties" : false
+ }
+ },
+ "type" : "object",
+ "properties" : {
+ "address" : {
+ "$ref" : "#/$defs/Address"
+ },
+ "createdAt" : {
+ "type" : "string",
+ "readOnly" : true
+ },
+ "email" : {
+ "type" : "string",
+ "format" : "email",
+ "pattern" : "\\b[A-Za-z0-9._%+-]+@baeldung\\.com\\b"
+ },
+ "friends" : {
+ "maxItems" : 10,
+ "type" : "array",
+ "items" : {
+ "$ref" : "#"
+ }
+ },
+ "id" : {
+ "type" : "string",
+ "readOnly" : true
+ },
+ "name" : {
+ "type" : "string"
+ },
+ "surname" : {
+ "type" : "string"
+ }
+ },
+ "required" : [ "address", "email", "id", "name", "surname" ],
+ "additionalProperties" : false
+}
\ No newline at end of file