Generate a Java Class From JSON – 从JSON生成一个Java类

最后修改: 2021年 9月 10日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

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.

在某些情况下,我们需要使用JSON文件创建Java类,也称为POJO。使用一个方便的jsonschema2pojo库,就可以不用从头开始编写整个类了。

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

在本教程中,我们将看到如何使用这个库从JSON对象中创建一个Java类。

2. Setup

2.设置

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

我们可以使用jsonschema2pojo-core依赖性将JSON对象转换成一个Java类:

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

3. JSON to Java Class Conversion

3.JSON到Java类的转换

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

让我们看看如何使用jsonschema2pojo库编写一个程序,将JSON文件转换成一个Java类。

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

首先,我们将创建一个方法convertJsonToJavaClass,将JSON文件转换为POJO类并接受四个参数。

  • 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

4.输入和输出

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

让我们使用这个JSON样本来执行程序。

{
  "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:

一旦我们执行我们的程序,它就会在给定的目录中创建以下Java类。

@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:

注意,它也因此为嵌套的JSON对象创建了一个新的Address

@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.

我们也可以通过简单地访问jsonschema2pojo.org来实现这一切。jsonschema2pojo工具采用JSON(或YAML)模式文档并生成DTO风格的Java类。它提供了许多选项,您可以选择将其包含在Java类中,包括构造函数以及hashCode、equals、toString方法。

5. Conclusion

5.总结

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

在本教程中,我们介绍了如何使用jsonschema2pojo库从JSON中创建一个Java类的例子。

As usual, code snippets are available over on GitHub.

像往常一样,代码片段可以在GitHub上找到