Course – LS (cat=JSON/Jackson)

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In some situations, we need to create Java classes, also called POJOs, using JSON files. This is possible without writing the whole class from scratch using a handy jsonschema2pojo library.

In this tutorial, we’ll see how to create a Java class from a JSON object using this library.

2. Setup

We can convert a JSON object into a Java class using the jsonschema2pojo-core dependency:

<dependency>
    <groupId>org.jsonschema2pojo</groupId>
    <artifactId>jsonschema2pojo-core</artifactId>
    <version>1.1.1</version>
</dependency>

3. JSON to Java Class Conversion

Let’s see how to write a program using the jsonschema2pojo library, which will convert a JSON file into a Java class.

First, we’ll create a method convertJsonToJavaClass that converts a JSON file to a POJO class and accepts four parameters:

  • an inputJson file URL
  • an outputJavaClassDirectory where the POJO would get generated
  • packageName to which the POJO class would belong and
  • an output POJO className.

Then, we’ll define the steps in this method:

  • We’ll start with creating an object of JCodeModel class, which will generate the Java class
  • Then, we’ll define the configuration for jsonschema2pojo, which lets the program identify that the input source file is JSON (the getSourceType method)
  • Furthermore, we’ll pass this configuration to a RuleFactory, which will be used to create type generation rules for this mapping
  • We’ll create a SchemaMapper using this factory along with the SchemaGenerator object, which generates the Java type from the provided JSON
  • Finally, we’ll call the build method of the JCodeModel to create the output class

Let’s see the implementation:

public void convertJsonToJavaClass(URL inputJsonUrl, File outputJavaClassDirectory, String packageName, String javaClassName) 
  throws IOException {
    JCodeModel jcodeModel = new JCodeModel();

    GenerationConfig config = new DefaultGenerationConfig() {
        @Override
        public boolean isGenerateBuilders() {
            return true;
        }

        @Override
        public SourceType getSourceType() {
            return SourceType.JSON;
        }
    };

    SchemaMapper mapper = new SchemaMapper(new RuleFactory(config, new Jackson2Annotator(config), new SchemaStore()), new SchemaGenerator());
    mapper.generate(jcodeModel, javaClassName, packageName, inputJsonUrl);

    jcodeModel.build(outputJavaClassDirectory);
}

4. Input and Output

Let’s use this sample JSON for the program execution:

{
  "name": "Baeldung",
  "area": "tech blogs",
  "author": "Eugen",
  "id": 32134,
  "topics": [
    "java",
    "kotlin",
    "cs",
    "linux"
  ],
  "address": {
    "city": "Bucharest",
    "country": "Romania"
  }
}

Once we execute our program, it creates the following Java class in the given directory:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"name", "area", "author", "id", "topics", "address"})
@Generated("jsonschema2pojo")
public class Input {

    @JsonProperty("name")
    private String name;
    @JsonProperty("area")
    private String area;
    @JsonProperty("author")
    private String author;
    @JsonProperty("id")
    private Integer id;
    @JsonProperty("topics")
    private List<String> topics = new ArrayList<String>();
    @JsonProperty("address")
    private Address address;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    // getters & setters
    // hashCode & equals
    // toString
}

Note that it has consequently created a new Address class for the nested JSON object as well:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"city", "country"})
@Generated("jsonschema2pojo")
public class Address {

    @JsonProperty("city")
    private String city;
    @JsonProperty("country")
    private String country;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    // getters & setters
    // hashCode & equals
    // toString
}

We can also achieve all of this by simply visiting jsonschema2pojo.org. The jsonschema2pojo tool takes a JSON (or YAML) schema document and generates DTO-style Java classes. It provides many options that you can choose to include in the Java class, including constructors as well as hashCode, equals, and toString methods.

5. Conclusion

In this tutorial, we covered how to create a Java class from JSON with examples using the jsonschema2pojo library.

As usual, code snippets are available over on GitHub.

Course – LS (cat=JSON/Jackson)

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.