java jackson json процессор - использование в RestTemplate - обработка EnumSet - PullRequest
0 голосов
/ 11 августа 2011

У меня есть приложение для Android, которое подключается к JSON WebService. Один из методов возвращает список строк, разделенных запятыми, для значения типа флага, другими словами, битовую маску. Например, он возвращает «FileAppend, FileOverwrite». Для этого типа у меня определено перечисление java

enum FileMode { FileAppend, FileOverwrite,   ... } 

и хотите, чтобы десериализатор Джексона автоматически преобразовал возвращенный список строк в полезной нагрузке JSON в перечисление. Я пробовал оба сырых Enum FileMode и EnumSet, но я получаю исключения в обоих случаях при десериализации. Есть ли способ как-то аннотировать, чтобы десериализатор знал, как его десериализовать?

@JsonIgnoreProperties(ignoreUnknown=true)
@JsonTypeName("AccessMask")
@JsonAutoDetect
public enum AccessMask {
None,

HideDateCreated,
HideDateModified,
HideDateTaken,
HideMetaData,
HideUserStats,
HideVisits,

NoCollections,
NoPrivateSearch,
NoPublicSearch,
NoRecentList,

ProtectExif,
ProtectXXLarge,             // new in version 1.3
ProtectExtraLarge,
ProtectLarge,
ProtectMedium,
ProtectOriginals,

ProtectGuestbook,           // new in version 1.1
NoPublicGuestbookPosts,     // new in version 1.1
NoPrivateGuestbookPosts,    // new in version 1.1
NoAnonymousGuestbookPosts,  // new in version 1.1

ProtectComments,            // new in version 1.1
NoPublicComments,           // new in version 1.1
NoPrivateComments,          // new in version 1.1
NoAnonymousComments,        // new in version 1.1

PasswordProtectOriginals,   // new in version 1.2

ProtectAll }

// and below is a property of a class defined below. 
class Picture {
  @JsonProperty("AccessMask")
  EnumSet<AccessMask> accessMask;
 }

AccessMask - это битовое поле, означающее, что в нем может быть установлено несколько полей (битовая маска). Когда я десериализовал этот класс с помощью JSON deserializer, я получил следующее исключение вложенным исключением является org.codehaus.jackson.map.JsonMappingException: невозможно десериализовать экземпляр java.util.EnumSet из маркера VALUE_STRING

В чем может быть причина?

Привет

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Если значение - как подсказывает сообщение об ошибке - просто строка JSON, а не ожидаемый массив строк, вам нужно написать собственный десериализатор.Но почему они не сериализуются как массивы JSON со значениями перечисления в виде отдельных строк?Джексон будет обрабатывать это автоматически без каких-либо аннотаций (ни одна из добавленных вами аннотаций не нужна, я полагаю, они были добавлены, чтобы попытаться заставить вещи работать?).

Вы можете зарегистрировать десериализатор либо непосредственно в поле (@JsonDeserialize (используя= MyDeserializer.class)) или путем регистрации десериализатора для этого типа.

0 голосов
/ 13 июня 2017

В json передайте значения как массив строк.Например, если у вас есть перечисление DAY, где DAY - это перечисление со значениями MONDAY, TUESDAY и т. Д., То передайте значения как - "days": ["MONDAY", "SUNDAY"]

десериализация по умолчанию приводит ксоздание enumset.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...