Обертка Restlet / Jackson JSON для ArrayList <Profile> - PullRequest
1 голос
/ 16 января 2012

Я использую библиотеку Restlet для сервера WS, и я недавно перешел с XStream / Jettison на Джексона в качестве сериализатора / десериализатора JSON из-за некоторых проблем.

Первый недостаток заключается в том, что мой ArrayList (ранее Vector с Jettison) не переносит список профилей при сериализации, а JSON вместо «Profile: [{firstProfile}, {secondProfile}]» »выглядит так: [{firstProfile}, {secondProfile}]

Я могу решить эту проблему на клиенте, говоря вручную, что является правильным отображением, но я бы предпочел использовать подход KVC.

Я посмотрел вокруг, и кажется, что этоизвестная проблема: http://wiki.fasterxml.com/JacksonPolymorphicDeserialization (5.1 Отсутствует информация о типах при сериализации), которую он предлагает:

  • Использовать массивы вместо списков
  • Список подклассов с использованием классаMyPojoList расширяет ArrayList {}
  • Принудительное использование определенного корневого типа

, самый простой способ вернуть массив «Profile [] profile», но, похоже, это не так.orking, перед тем как попробовать другие решения, которые я перепроверил, и кажется, что вы можете использовать @XmlRootElement (name = "Profile"), чтобы обернуть корневой элемент JSON: http://jira.codehaus.org/browse/JACKSON-163?focusedCommentId=213588&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-213588

, поэтому для использования аннотаций JAXBс Джексоном вам необходимо настроить objectMapper: http://wiki.fasterxml.com/JacksonJAXBAnnotations

, но в рестлете для этого вам необходимо переопределить createObjectMapper для передачи пользовательского конвертера (см .: http://restlet -discuss.1400322.n2.nabble.com / Set-custom-objectMapper-to-Jackson-Extension-td6287812.html и http://restlet -discuss.1400322.n2.nabble.com / Jackson-Mix-in-Annotations-td6211060.html # a6231831 )

Это то, что я сейчас пытаюсь!Вопрос в том, есть ли более простой способ добиться этого?

Спасибо !!

Ответы [ 2 ]

1 голос
/ 17 января 2012

для меня решение состоит в том, чтобы аннотировать класс Profile с помощью:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
public class Profile extends Element implements Serializable {

, и теперь json теперь выглядит так:

{"Profile":{ ... }}

, а тип возвращаемого значения - подклассифицированный.список:

public class ProfileList extends ArrayList<Profile>
{}

см. http://wiki.fasterxml.com/JacksonPolymorphicDeserialization 5.1

0 голосов
/ 17 января 2012

Я думаю, что то, что вы хотите, на самом деле не доступно в том смысле, что JAX-B, похоже, имеет некоторые правила работы со списками. См. эту беседу в списке рассылки RESTeasy

...