2016-05-27 3 views
-3

Я хочу, чтобы следующее перечисление было сериализовано/десериализовано с использованием apiValue (SUN, MON, ...) вместо значения enum (SUNDAY, MONDAY, ....). Я использую аннотацию @JsonValue, но она не работает (т. Е. Использует значение перечисления). Любая идея, как решить эту проблему?Аннотации Джексона «JsonValue» не работают

import java.util.*; 

import com.fasterxml.jackson.annotation.JsonValue; 

public enum ApiNotificationScheduleDayInWeek { 
     SUNDAY("SUN", 1), 
     MONDAY("MON", 2), 
     TUESDAY("TUE", 3), 
     WEDNESDAY("WED", 4), 
     THURSDAY("THU", 5), 
     FRIDAY("FRI", 6), 
     SATURDAY("SAT", 7), 
     WEEKDAY("WEEKDAY", 8), 
     WEEKEND("WEEKEND", 9); 
    private String apiValue; 
    private Integer intValue; 

    @JsonValue 
    public String getApiValue() { 
     return apiValue; 
    } 

    private ApiNotificationScheduleDayInWeek(String apiValue, Integer intValue) { 
     this.apiValue = apiValue; 
     this.intValue = intValue; 
    } 

} 
+0

Просьба показать код сериализации. [MCVE]. –

ответ

0

Вы правильно выполняете сериализацию, так что что-то не так. Поскольку вы используете аннотации Jackson2, убедитесь, что вы используете Jackson2 для сериализации (не Jackson1 или любой другой библиотеки). Также выполните общие проверки здравомыслия, такие как проверка того, были ли вы скомпилированы ваши классы, развернуто ваше приложение и т. Д.

Что касается десериализации, вам также необходимо сообщить Jackson, как получить экземпляр enum из вашего значения API. Для этого вы можете аннотировать статический метод поиска с помощью @JsonCreator. Пример:

import com.fasterxml.jackson.annotation.JsonCreator; 

@JsonCreator 
public static ApiNotificationScheduleDayInWeek fromApiValue(String value) { 
    if (value == null) { 
     return null; 
    } 
    for (ApiNotificationScheduleDayInWeek day : ApiNotificationScheduleDayInWeek.values()) { 
     if (value.equalsIgnoreCase(day.getApiValue())) { 
      return day; 
     } 
    } 
    throw new IllegalArgumentException("Invalid API value: " + value); 
} 
+0

Должен ли я иметь метод, аннотированный как JsonCreator, чтобы заставить JsonValue работать? –

+0

Нет, '@ JsonCreator' предназначен для десериализации. Сериализация должна работать только с '@ JsonValue'. Мы используем оба в наших проектах, и он работает так, как ожидалось. –

+0

@ArianHosseinzadeh, если у вас все еще есть проблемы с этим, отправьте дополнительную информацию, как было упомянуто в другом комментарии: как вы сериализуете значения, включая любую конфигурацию ObjectMapper и т. Д. –

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