1. 概述

在某些情况下,我们需要使用JSON文件创建Java类,通常称为简单对象表示器(POJO)。这可以通过一个便捷的工具***jsonschema2pojo***来实现,而无需从头开始编写整个类。

在这个教程中,我们将学习如何使用这个库将JSON对象转换为Java类。

2. 准备工作

我们可以使用[jsonschema2pojo-core](https://mvnrepository.com/artifact/org.jsonschema2pojo/jsonschema2pojo-core)依赖项将JSON对象转换为Java类:

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

3. JSON到Java类转换

让我们通过jsonschema2pojo库编写一个程序,该程序将把JSON文件转换为Java类。

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

  • 输入JSON文件的inputJson URL
  • 生成POJO的输出目录outputJavaClassDirectory
  • POJO所属的包名packageName,以及
  • 输出POJO的类名className

然后,我们在方法中定义步骤:

  • 我们首先创建一个JCodeModel对象,用于生成Java类
  • 然后,我们定义jsonschema2pojo的配置,让程序识别输入源文件是JSON(getSourceType方法)
  • 此外,我们将这个配置传递给一个RuleFactory,用于为这种映射创建类型生成规则
  • 我们使用工厂创建一个SchemaMapper,结合SchemaGenerator对象,它根据提供的JSON生成Java类型
  • 最后,我们调用JCodeModelbuild方法来创建输出类

以下是实现:

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. 输入与输出

让我们使用以下示例JSON运行程序:

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

执行程序后,它将在指定目录中生成以下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
}

请注意,它还相应地为嵌套的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
}

我们也可以直接访问jsonschema2pojo.org实现这一切。jsonschema2pojo工具接收JSON(或YAML)规范文档,并生成具有DTO风格的Java类。它提供了许多可选功能,可以在Java类中包含,例如构造函数以及hashCode, equalstoString方法。

5. 总结

在这篇教程中,我们介绍了如何使用jsonschema2pojo库通过示例创建JSON到Java类的转换。

如往常一样,代码片段可在GitHub上找到。