gpt4 book ai didi

java - 序列化/反序列化公共(public)枚举的简单方法?

转载 作者:行者123 更新时间:2023-11-30 08:37:48 24 4
gpt4 key购买 nike

我在尝试用 Java 序列化/反序列化一些 enum 时遇到了一些问题。这是我的枚举类:

频率类型.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 调用此方法时,我都会收到一条错误消息:

"Could not read JSON: Can not deserialize instance of com.zuora.cds.api.schedule.FrequencyType out of START_OBJECT token\n at [Source: java.io.PushbackInputStream@225337f8; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.zuora.cds.api.schedule.FrequencyType out of START_OBJECT token\n at [Source: 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 但我最终得到了同样的错误。任何帮助,将不胜感激。谢谢!

最佳答案

Jackson 中的枚举类型通常是原始序列化和反序列化的,如 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 对象,提取名称-值对,并将字符串值转换为枚举值。


如果您没有在代码中将任何其他内容反序列化为 JSON,您可以配置 ObjectMapper 以解包根值。

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);

您还必须为您的enum 类型配置根名称

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

关于java - 序列化/反序列化公共(public)枚举的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36943705/

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