2016-04-29 112 views
1

我在尝试序列化/反序列化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 out of START_OBJECT token \ n at [Source:[email protected]; line:1,column:1]; 嵌套异常是 com.fasterxml .jackson.databind.JsonMappingException:不能 反序列化com.zuora.cds.api.schedul的实例e.Frequency在[Source: [email protected];中输入START_OBJECT标记\ n的 ;行:1,柱:1]”,

我曾试图在上面JsonIncludeJsonIgnoreProperties annotationis增加,但似乎并没有帮助我也尝试添加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但我最终得到了同样的错误。任何帮助,将不胜感激。谢谢!

+0

尝试'{ “frequencyType”:1}',如果不行'Serialize'一个' FrequencyType“,看看你的图书馆期望什么。 –

+0

@ElliottFrisch你能详细说明你的工作'Serialize'是什么意思'FrequencyType'?第一种方法不起作用。 – user1871869

回答

2

枚举类型杰克逊通常系列化,反序列化原始,如JSON 字符串

你试图反序列化一个JSON对象作为枚举

{ 
    "frequencyType": "HOURLY" 
} 

这就是与名frequencyType一个名称 - 值对,这是一个JSON字符串值的JSON对象。

你需要创建一个POJO来包装这个对象

class FrequencyTypeWrapper { 
    private FrequencyType frequencyType; 

    // getters and setters 
} 

Jackson will eventually support a @JsonWrapped annotation,你很可能可以添加到您的枚举类型,这表明你想让它有一些名字被包裹一个根对象。

另一种方法是为该枚举类型编写并注册自己的JsonDeserializer,该枚举类型进行适当的转换,即。解析JSON对象,提取名称 - 值对,并将字符串值转换为枚举值。


如果你没有在你的代码反序列化别的什么JSON,你可以配置你ObjectMapper解开根值。

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 

你不得不为你的enum型配置根名称以及

@JsonRootName("frequencyType") 
enum FrequencyType { 
    HOURLY /* more */; 
} 
+0

啊,我明白你在说什么了。那么我会做一些这样的类:'public class FrequencyTypeWrapper private FrequencyType frequencyType; \t public FrequencyType getFrequencyType(){ \t \t return frequencyType; \t} \t public void setFrequencyType(String frequencyType){ String result = frequencyType; //解析频率类型... \t \t this.frequencyType = result; \t} }' – user1871869

+0

@ user1871869是的,您可以使用该类型作为您的处理程序方法的参数。还有其他选项(但它们在所有情况下可能都没有用),请参阅我的编辑。 –

+0

这工作完美。非常感谢! – user1871869