【发布时间】:2015-03-07 23:00:22
【问题描述】:
我有什么:
我正在从 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;
}
}
}
}
上述代码应将 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 Schema Module 源代码中进行了一些挖掘,发现发生的事情是 Jackson 使用“.toString()”作为枚举类型的默认序列化方法,但我需要它做的是创建基于StartDayOfWeek.values() 的行看起来像这样:
"enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]
有人知道怎么做吗?
【问题讨论】:
-
也许你想试试 JJSchema。
-
鉴于我在遵循他们的使用示例时获得了 NPE,事实上该项目在 6 个月内没有更新,而且它显然仍处于 beta 状态,我不要认为这是一个很好的选择
-
您是否已经使用自定义反序列化器来正确反序列化(即作为枚举,而不是作为字符串)星期几的值?
-
是的,Spring 为我们处理了所有这些
标签: java json enums jackson jackson-modules