Intereting Posts
Что нужно использовать в качестве полезной нагрузки разработчика в API-интерфейсах Google In-App Billing? Как размыть изображение в андроиде Ионный сбор Android | Ошибка: не найдены установленные инструменты сборки. Установите инструменты для сборки Android Вы не приняли лицензионные соглашения следующих компонентов SDK Использование атрибута размера HTML в TextView Управление идентификационным номером GCM на сервере Получить последнюю измененную дату файлов в каталоге Прокрутить веб-просмотр в Viewpager В чем разница между @ + id / android: list и @ + id / list Пользовательский переход общего элемента в конечной активности Android: layout_alignParentBottom = "true" с использованием клавиатуры Takepicture зависает на Android 2.3.3 Как прослушивать двойную привязку в представлении в Android? Проводка в приложение Ruby on Rails из Android Crosswalk Cordova – js alert показывает символы блока на китайском интерфейсе android

@IntDef Android поддерживает аннотацию с десериализацией Джексона

Использование JacksonAnnotations вместе с аннотациями поддержки Android. Мой POJO:

@JsonIgnoreProperties(ignoreUnknown = true) public class Schedule { public static final int SUNDAY = 0; public static final int MONDAY = 1; public static final int TUESDAY = 2; public static final int WEDNESDAY = 3; public static final int THURSDAY = 4; public static final int FRIDAY = 5; public static final int SATURDAY = 6; private Integer weekday; public Schedule() { } @Weekday public Integer getWeekday() { return weekday; } public void setWeekday(@Weekday Integer weekday) { this.weekday = weekday; } @Retention(RetentionPolicy.RUNTIME) @IntDef({SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}) public @interface Weekday {} } 

От поддержки я получаю объект:

 {"schedule":{"weekday":"MONDAY"}} 

То, что я хочу, – сопоставить Weekday с его целым значением, определенным в константах. Есть ли способ, которым я могу это достичь?

Обновление . Основная цель – оптимизация ( вы должны строго избегать использования перечислений на Android, как это сказано здесь ).

Solutions Collecting From Web of "@IntDef Android поддерживает аннотацию с десериализацией Джексона"

Поскольку вы можете рассчитывать на то, что будни не выходят из-под контроля, создание статической карты кажется довольно чистым решением. Предоставление фабрики @JsonCreator названием fromString будет работать с Jackson, а также будет хорошо играть с JAX-RS :

 public class Schedule { ... private static final ImmutableMap<String, Schedule> WEEKDAY_TO_INT_MAP = ImmutableMap.<String, Schedule>builder() .put("SUNDAY", withIntWeekday(0)) .put("MONDAY", withIntWeekday(1)) .put("TUESDAY", withIntWeekday(2)) .put("WEDNESDAY", withIntWeekday(3)) .put("THURSDAY", withIntWeekday(4)) .put("FRIDAY", withIntWeekday(5)) .put("SATURDAY", withIntWeekday(6)) .build(); public static Schedule withIntWeekday(int weekdayInt) { Schedule schedule = new Schedule(); schedule.setWeekday(weekdayInt); return schedule; } @JsonCreator public static Schedule fromString(String weekday) { return WEEKDAY_TO_INT_MAP.get(weekday); } ... } 

Может быть, я чего-то не хватает, но почему бы не сделать что-то вроде этого:

 public class Schedule { public enum Weekday { SUNDAY(0), MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6); private final Integer weekday; Weekday(Integer weekday) { this.weekday = weekday; } public Integer getWeekday() { return weekday; } } private Weekday weekday; public Integer getWeekday() { return weekday.getWeekday(); } public void setWeekday(Weekday weekday) { this.weekday = weekday; } } 

Если бэкэнд возвращает "MONDAY" в качестве строки, вы, вероятно, не должны использовать @IntDef потому что вам придется управлять преобразованием "MONDAY" в целочисленное значение.

Я попытался бы использовать аннотацию @StringDef вместо этого вам не придется беспокоиться о каком-либо преобразовании между бэкэнд и клиентским приложением. Единственный улов – вам нужно иметь надежные ответы от вашего бэкэнда и заранее согласовывать соглашения об именах.

Если вы измените тип с @IntDef на @StringDef он будет выглядеть так:

 @JsonIgnoreProperties(ignoreUnknown = true) public class Schedule { public static final String SUNDAY = "SUNDAY"; public static final String MONDAY = "MONDAY"; public static final String TUESDAY = "TUESDAY"; public static final String WEDNESDAY = "WEDNESDAY"; public static final String THURSDAY = "THURSDAY"; public static final String FRIDAY = "FRIDAY"; public static final String SATURDAY = "SATURDAY"; private String weekday; public Schedule() { } @Weekday public String getWeekday() { return weekday; } public void setWeekday(@Weekday String weekday) { this.weekday = weekday; } @Retention(RetentionPolicy.RUNTIME) @StringDef({SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}) public @interface Weekday {} } 

Элегантное решение использует Enum.

Эффективное решение заключается в написании пользовательского сериализатора, который отображает строку дня недели в int и наоборот с помощью операторов switch.

Вы также можете получить доступ к значениям в аннотации StringDef используя отражение в вашем сериализаторе, но это будет медленнее и менее читаемо.