gpt4 book ai didi

java - 从 POJO 生成 Json Schema

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:33 25 4
gpt4 key购买 nike

我有什么:

我正在从 pojo 生成 JSON 架构。我生成架构的代码如下所示:

ObjectMapper mapper = new ObjectMapper();
TitleSchemaFactoryWrapper visitor = new TitleSchemaFactoryWrapper();
mapper.acceptJsonFormatVisitor(clazz, visitor);
JsonSchema schema = visitor.finalSchema();
schemas.put(clazz, mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema));

我通过上面的代码生成了几个模式。其中一个 pojo 有一个内部嵌入式枚举来限制可能的值,如下所示:

public class MyClass {

@JsonProperty("name")
private String name;
@JsonProperty("startDayOfWeek")
private MyClass.StartDayOfWeek startDayOfWeek;
/**
* The ID of a timezone returned by the timezones route.
*
*/
@JsonProperty("timezone")
private String timezone;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
*
* @return
* The startDayOfWeek
*/
@JsonProperty("startDayOfWeek")
public MyClass.StartDayOfWeek getStartDayOfWeek() {
return startDayOfWeek;
}

/**
*
* @param startDayOfWeek
* The startDayOfWeek
*/
@JsonProperty("startDayOfWeek")
public void setStartDayOfWeek(MyClass.StartDayOfWeek startDayOfWeek) {
this.startDayOfWeek = startDayOfWeek;
}

public static enum StartDayOfWeek {

MONDAY("Monday"),
TUESDAY("Tuesday"),
WEDNESDAY("Wednesday"),
THURSDAY("Thursday"),
FRIDAY("Friday"),
SATURDAY("Saturday"),
SUNDAY("Sunday");
private final String value;
private static Map<String, MyClass.StartDayOfWeek> constants = new HashMap<String, MyClass.StartDayOfWeek>();

static {
for (MyClass.StartDayOfWeek c: values()) {
constants.put(c.value, c);
}
}

private StartDayOfWeek(String value) {
this.value = value;
}

@JsonValue
@Override
public String toString() {
return this.value;
}

@JsonCreator
public static MyClass.StartDayOfWeek fromValue(String value) {
MyClass.StartDayOfWeek constant = constants.get(value);
if (constant == null) {
throw new IllegalArgumentException(value);
} else {
return constant;
}
}

}

}

上面的代码应该限制传递给“Monday”、“Tuesday”、“Wednesday”等的 JSON 数据中可能的字符串值。

当我在有问题的代码上运行架构生成器时,我希望得到类似于以下架构的内容:

{
"type" : "object",
"javaType" : "my.package.MyClass",
"properties": {
"startDayOfWeek" : {
"type" : "string",
"enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]
}
}
}

但我得到的是这个:

{
"type" : "object",
"id" : "urn:jsonschema:my:package:MyClass",
"title" : "Lmy/package/MyClass;",
"properties" : {
"startDayOfWeek" : {
"type" : "string"
}
}
}

我在 Jackson 模式模块源代码中做了一些挖掘,发现发生的事情是 Jackson 使用“.toString()”作为枚举类型的默认序列化方法,但我需要它做的是创建基于 StartDayOfWeek.values() 看起来像这样的行:

"enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]

有人知道怎么做吗?

最佳答案

使用我发现的使用数据绑定(bind)的说明似乎是不可能的。但是我发现了另一个 jackson 模块,它似乎可以很好地解决这个问题。奇怪的是,有几个对象的名称相同。

TLDR:使用 org.codehaus.jackson.map 包中的对象,而不是 com.fasterxml.jackson.databind 包中的对象。如果您按照 this 上的说明进行操作页面那么你做错了。只需使用 jackson-mapper 模块即可。

这是供 future google 员工使用的代码:

private static String getJsonSchema(Class clazz) throws IOException {
org.codehaus.jackson.map.ObjectMapper mapper = new ObjectMapper();
//There are other configuration options you can set. This is the one I needed.
mapper.configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true);

JsonSchema schema = mapper.generateJsonSchema(clazz);

return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema);
}

关于java - 从 POJO 生成 Json Schema,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27863689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com