Pregunta

Estoy usando Jersey y quiero emitir el siguiente JSON con solo los campos enumerados:

[
    {
      "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"
    }
]

Si es necesario, puedo rodear a ese JSON con {"Feeds": ...}, pero tener esto es opcional sería lo mejor. Quiero extraer esta información de una lista de alimentos calendario que se almacenan en un miembro miembro que se recupera a través de Hibernate. Aquí están los 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;
}

Actualmente, tengo un recurso de jersey llamado CalendArResource que genera manualmente a JSON con la información del calendario:

@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();
    }
}

Pero no estoy seguro de cómo automatizar esto. Estoy empezando a usar Jersey y no tengo claro cómo usarlo para devolver JSON. Parece que tiene una manera de hacerlo, pero parece que necesito agregar anotaciones a mis Pojos. Además, leí a otros diciendo que necesito usar Jackson. He estado buscando en Google y parece que no puedo localizar un buen y simple ejemplo de devolver a JSON de un recurso de jersey. ¿Alguien sabe de alguno? ¿O puedes mostrarme cómo usar Jackson o Jersey para crear JSON para el ejemplo anterior?

¿Fue útil?

Solución

Descubrí cómo hacer esto usando Jackson 1.4. No estoy usando Jersey-Json, ya que se basa en una versión anterior de Jackson y necesitaba la versión 1.4 para usar JSONVIEWS.

Aquí está el pojo anotado:

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

Aquí está el recurso de 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 "{}";
 }
}

Aquí está mi frijol de primavera:

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

La salida es exactamente lo que necesito. Y usando JSONVIEWS, puedo personalizar qué campos obtienen salida para diferentes situaciones.

¡Ojalá esto ayude a alguien más!

Otros consejos

Esto ha cambiado desde que se escribió la respuesta aceptada.

Si enciende el PoJomappingFeature, Jersey invocará automáticamente el objeto. En un entorno de servlet, haga lo siguiente dentro de la definición de su camiseta:

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

Ahora puede simplemente devolver los feeds desde el punto final.

@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<CalendarFeeds> getCalendars() {
    Member member = memberService.getCurrentMember();
    return member.getCalendarFeeds();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top