对于我的许多项目,我喜欢使用
org.jsonschema2pojo.jsonschema2pojo-maven-plugin
maven 插件,以便从 json 模式文件生成一些 POJO 类。这非常有效,让我免于编写样板代码。
但是,我经常将这些类视为最终且不可变的,因此我希望能够生成 Java 记录,这样我就可以强制执行这些限制并获得记录带来的性能增强。我已经阅读了 documentation 和 GitLab repo 但我没有看到任何方法可以使用这个特定的插件来做到这一点。
是否有我错过的东西,或者是否有其他插件或库提供此功能?
我会避免使用记录,不仅因为它们应该只存储一些值,而且因为它们没有与传统类相同级别的控制。
使用 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
,并修改了注明的字段。