序列化/反序列化公共枚举的简便方法?

时间:2016-04-29 16:52:05

标签: java json spring serialization enums

我在尝试序列化/反序列化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]“,

我尝试添加上述JsonIncludeJsonIgnoreProperties注释,但这似乎没有帮助。我还尝试添加getterssetters,如下所示:

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,但我最终得到了相同的错误。任何帮助,将不胜感激。谢谢!

2 个答案:

答案 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)