从Json schema生成记录

问题描述 投票:0回答:1

对于我的许多项目,我喜欢使用

org.jsonschema2pojo.jsonschema2pojo-maven-plugin
maven 插件,以便从 json 模式文件生成一些 POJO 类。这非常有效,让我免于编写样板代码。

但是,我经常将这些类视为最终且不可变的,因此我希望能够生成 Java 记录,这样我就可以强制执行这些限制并获得记录带来的性能增强。我已经阅读了 documentationGitLab repo 但我没有看到任何方法可以使用这个特定的插件来做到这一点。

是否有我错过的东西,或者是否有其他插件或库提供此功能?

java maven record java-14
1个回答
0
投票

我会避免使用记录,不仅因为它们应该只存储一些值,而且因为它们没有与传统类相同级别的控制。

使用 Jackson 的

@JsonProperty
注释,您可以告诉序列化器/反序列化器如何将每个键映射到适当的字段。

如果生成类存根并添加一些 Lombok,则可以简化此过程。

以下 JSON:

/** https://json.org/example.html */
{
  "glossary": {
    "title": "example glossary",
    "GlossDiv": {
      "title": "S",
      "GlossList": {
        "GlossEntry": {
          "ID": "SGML",
          "SortAs": "SGML",
          "GlossTerm": "Standard Generalized Markup Language",
          "Acronym": "SGML",
          "Abbrev": "ISO 8879:1986",
          "GlossDef": {
            "para": "A meta-markup language, used to create markup languages such as DocBook.",
            "GlossSeeAlso": ["GML", "XML"]
          },
          "GlossSee": "markup"
        }
      }
    }
  }
}

转换为以下形状:

package org.example.json;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

public class GenerateClasses {
    private static final ObjectMapper om = new ObjectMapper();
    private static final ClassLoader classLoader = GenerateClasses.class.getClassLoader();

    public static void main(String[] args) {
        try (InputStream is = classLoader.getResourceAsStream("glossary.json")) {
            Root root = om.readValue(is, Root.class);
            System.out.println(root); // Object::toString
            System.out.println(om.writerWithDefaultPrettyPrinter().writeValueAsString(root));
        } catch (IOException e) {
            System.out.println("Failed to read JSON");
        }
    }

    @Data
    public static class Glossary {
        private String title;
        @JsonProperty("GlossDiv")
        private GlossDiv glossDiv;
    }

    @Data
    public static class GlossDef {
        private String para;
        @JsonProperty("GlossSeeAlso")
        private List<String> glossSeeAlso; /* Changed from ArrayList */
    }

    @Data
    public static class GlossDiv {
        private String title;
        @JsonProperty("GlossList")
        private GlossList glossList;
    }

    @Data
    public static class GlossEntry {
        @JsonProperty("ID")
        private String id; /* Manually changed from 'iD' */
        @JsonProperty("SortAs")
        private String sortAs;
        @JsonProperty("GlossTerm")
        private String glossTerm;
        @JsonProperty("Acronym")
        private String acronym;
        @JsonProperty("Abbrev")
        private String abbrev;
        @JsonProperty("GlossDef")
        private GlossDef glossDef;
        @JsonProperty("GlossSee")
        private String glossSee;
    }

    @Data
    public static class GlossList {
        @JsonProperty("GlossEntry")
        private GlossEntry glossEntry;
    }

    @Data
    public static class Root {
        private Glossary glossary;
    }
}

我使用以下工具生成了上面的代码:

https://json2csharp.com/code-converters/json-to-pojo(选择 JSON > Java)

我添加了 Lombok

@Data
注释,将所有字段设为
private
,并修改了注明的字段。

© www.soinside.com 2019 - 2024. All rights reserved.