我在尝试序列化/反序列化Java中的某些enum
时遇到了一些麻烦。这是我的枚举类:
FrequencyType.java:
@JsonInclude(Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public enum FrequencyType {
NONE,
HOURLY,
DAILY,
WEEKLY,
MONTHLY;
}
Controller.java
@RequestMapping(method = RequestMethod.POST)
public Object createFrequency(@RequestBody FrequencyType frequencyType) throws Exception {
...
frequencyManager.createFrequency(frequencyType);
...
}
我正在尝试使用createFrequency
方法接收FrequencyType
作为json
输入。以下是我输入的示例:
{
"frequencyType": "HOURLY"
}
但是,每当我尝试通过REST API调用此方法时,都会收到错误消息:
“无法读取JSON:无法反序列化实例 com.zuora.cds.api.schedule.FrequencyType超出START_OBJECT标记\ n 在[来源:java.io.PushbackInputStream@225337f8; line:1,column:1]; 嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:不能 反序列化com.zuora.cds.api.schedule.FrequencyType out的实例 在[来源:的START_OBJECT令牌\ n java.io.PushbackInputStream@225337f8; line:1,column:1]“,
我尝试添加上述JsonInclude
和JsonIgnoreProperties
注释,但这似乎没有帮助。我还尝试添加getters
和setters
,如下所示:
FrequencyType getNone() {
return FrequencyType.NONE;
}
FrequencyType getHourly() {
return FrequencyType.HOURLY;
}
FrequencyType getDaily() {
return FrequencyType.DAILY;
}
FrequencyType getWeekly() {
return FrequencyType.WEEKLY;
}
FrequencyType getMonthly() {
return FrequencyType.MONTHLY;
}
void setNone(FrequencyType frequencyType) {
this.equals(frequencyType);
}
void setHourly(FrequencyType frequencyType) {
this.equals(frequencyType);
}
void setDaily(FrequencyType frequencyType) {
this.equals(frequencyType);
}
void setWeekly(FrequencyType frequencyType) {
this.equals(frequencyType);
}
void setMonthly(FrequencyType frequencyType) {
this.equals(frequencyType);
}
这样POJO表示有望将JSON转换为FrequencyType
,但我最终得到了相同的错误。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:2)
杰克逊中的枚举类型通常是原始序列化和反序列化的,因为JSON 字符串。
您尝试将JSON 对象反序列化为枚举
{
"frequencyType": "HOURLY"
}
这是一个JSON对象,具有名称为frequencyType
的单个名称 - 值对,以及一个JSON字符串值。
您需要创建一个POJO来包装此对象
class FrequencyTypeWrapper {
private FrequencyType frequencyType;
// getters and setters
}
Jackson will eventually support a @JsonWrapped
annotation您可能会添加到枚举类型中,表示您希望它在根对象中包含一些名称。
另一种方法是为执行适当转换的枚举类型编写并注册自己的JsonDeserializer
,即。解析JSON对象,提取名称 - 值对,并将String值转换为枚举值。
如果您未在代码中将其他任何内容反序列化为JSON,则可以配置ObjectMapper
以解包根值。
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
您还必须为enum
类型配置根名称
@JsonRootName("frequencyType")
enum FrequencyType {
HOURLY /* more */;
}
答案 1 :(得分:0)
您可以简单地:
添加以下注释:
-1。
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum FrequencyType {
-2。将以下注释添加到设置器中:
@JsonDeserialize(using = EnumDeserializer.class)