2016-04-29 3 views
1

У меня возникли проблемы с сериализацией/десериализацией enum в Java. Вот мой перечисление класс:Простой способ сериализации/десериализации публичных перечислений?

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 в [Источник: [email protected]; линии: 1, колонка: 1]; вложенной исключение составляет com.fasterxml .jackson.databind.JsonMappingException: не может десериализовать экземпляр com.zuora.cds.api.schedul e.FrequencyType out токена START_OBJECT \ n в [Источник: [email protected]; линия: 1, колонка:. 1]»,

Я пытался добавить в вышеуказанных JsonInclude и JsonIgnoreProperties annotationis, но это не похоже, чтобы помочь я также пытался добавить 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

Try '{ "frequencyType": 1}', если это не работает, '' Serialize' FrequencyType' и посмотреть, что ожидает ваша библиотека. –

+0

@ElliottFrisch не могли бы вы рассказать о том, что вы хотите для работы 'Serialize' a' FrequencyType'? Первый метод не работал. – user1871869

ответ

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 в значение enum.


Если вы что-нибудь еще, чтобы 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) { Строковый результат = frequencyType; // Parse frequencyType ... \t this.frequencyType = result; \t} } ' – user1871869

+0

@ user1871869 Да, и вы должны использовать этот тип для параметра вашего метода обработчика. Существуют и другие варианты (но они могут быть не полезны во всех случаях), см. Мое редактирование. –

+0

Это сработало отлично. Спасибо огромное! – user1871869

Смежные вопросы