Pergunta

Estou usando Jersey e quero produzir o seguinte JSON com apenas os campos listados:

[
    {
      "name": "Holidays",
      "value": "http://www.google.com/calendar/feeds/usa__en%40holiday.calendar.google.com/public/basic"
    },
    {
      "name": "Personal",
      "value": "http://www.google.com/calendar/feeds/myprivatefeed/basic"
    }
]

Se devo, posso cercar esse JSON com {"Feeds": ...}, mas ter isso opcional seria melhor. Quero extrair essas informações de uma lista de calendários que são armazenados em um Pojo de Membro que é recuperado via Hibernate. Aqui estão os Pojos simplificados:

public class Member {
    private String username;
    private String password;
    private Set<CalendarFeed> calendarFeeds = new HashSet<CalendarFeed>();
}

public class CalendarFeed {
    public enum FeedType { GCAL, EVENT };
    private Member owner;
    private String name;
    private String value;
    private FeedType type;
}

Atualmente, eu tenho um recurso de camisa chamado CalendarResource que produz manualmente JSON com o calendário Feeds Information:

@Path("/calendars")
public class CalendarResource {

    @Inject("memberService")
    private MemberService memberService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getCalendars() {
        // Get currently logged in member
        Member member = memberService.getCurrentMember();

        StringBuilder out = new StringBuilder("[");
        boolean first = true;
        for (CalendarFeed feed : member.getPerson().getCalendarFeeds()) {
            if (!first) {
                out.append(",");
            }
            out.append("{\"");
            out.append(feed.getName());
            out.append("\":\"");
            out.append(feed.getValue());
            out.append("\"}");
            first = false;
        }
        out.append("]");
        return out.toString();
    }
}

Mas não tenho certeza de como automatizar isso. Estou apenas começando a usar Jersey e não estou claro sobre como usá -lo para devolver o JSON. Parece que ele tem uma maneira de fazer isso embutido, mas parece que preciso adicionar anotações aos meus poços. Além disso, li outras pessoas dizendo que preciso usar Jackson. Estou pesquisando no Google e não consigo localizar um exemplo bom e simples de devolver o JSON de um recurso de camisa. Alguém conhece algum? Ou você pode me mostrar como usar Jackson ou Jersey para criar o JSON para o exemplo acima?

Foi útil?

Solução

Eu descobri como fazer isso usando o Jackson 1.4. Não estou usando Jersey-Json, pois é baseado em uma versão mais antiga de Jackson e eu precisava da versão 1.4 para usar o JSONVIEWS.

Aqui está o pojo anotado:

public class CalendarFeed {
    public enum FeedType { GCAL, EVENT };
    @JsonIgnore
    private Member owner;
    private String name;
    private String value;
    @JsonIgnore
    private FeedType type;
}

Aqui está o recurso Jersey:

@Path("/calendar")
public class CalendarResource {

 @Inject("memberService")
 private MemberService memberService;

 @Inject
 private ObjectMapper mapper;

 @GET
 @Produces(MediaType.APPLICATION_JSON)
 public String getCalendars() {
  Member member = memberService.getCurrentMember();
  try {
   return mapper.writeValueAsString(member.getCalendarFeeds());
  } catch (JsonGenerationException e) {
  } catch (JsonMappingException e) {
  } catch (IOException e) {
  }
  return "{}";
 }
}

Aqui está o meu feijão da primavera:

<!-- Jackson JSON ObjectMapper -->
<bean id="objectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>

A saída é exatamente o que eu preciso. E usando o JSONVIEWS, posso personalizar quais campos obtêm saída para diferentes situações.

Espero que isso ajude outra pessoa!

Outras dicas

Isso mudou desde que a resposta aceita foi escrita.

Se você ligar o PojomappingFeature, o ObjectMapper será invocado automaticamente por Jersey. Em um ambiente de servlet, faça o seguinte na definição de sua camisa:

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

Agora você pode simplesmente retornar os feeds do terminal.

@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<CalendarFeeds> getCalendars() {
    Member member = memberService.getCurrentMember();
    return member.getCalendarFeeds();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top