Frage

Ich benutze Jersey und möchte den folgenden JSON mit nur den aufgeführten Feldern ausgeben:

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

Wenn ich muss, kann ich diesen JSON mit {"Feeds": ...} umgeben, aber dies ist am besten. Ich möchte diese Informationen aus einer Liste von Kalenderernen ziehen, die in einem Mitgliedspojo gespeichert sind, das über Hibernate abgerufen wird. Hier sind die vereinfachten Pojos:

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;
}

Derzeit habe ich eine Jersey -Ressource namens Calendarresource, die JSON manuell mit den Kalender -Feeds -Informationen ausgibt:

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

Aber ich bin mir nicht sicher, wie ich das automatisieren soll. Ich fange gerade an, Jersey zu benutzen und bin mir nicht klar, wie ich es verwenden kann, um JSON zurückzugeben. Es hört sich so an, als hätte es eine Möglichkeit, dies eingebaut zu machen, aber es sieht so aus, als müsste ich meinen Pojos Anmerkungen hinzufügen. Außerdem las ich andere, die sagen, dass ich Jackson benutzen muss. Ich habe gegoogelt und kann ein gutes und einfaches Beispiel für die Rückgabe von JSON aus einer Jersey -Ressource nicht finden. Kennt jemand etwas? Oder können Sie mir zeigen, wie Sie Jackson oder Jersey verwenden, um JSON für das obige Beispiel zu erstellen?

War es hilfreich?

Lösung

Ich habe herausgefunden, wie das mit Jackson 1.4 geht. Ich verwende Jersey-Json nicht, da es auf einer älteren Version von Jackson basiert und ich Version 1.4 brauchte, um JsonViews zu verwenden.

Hier ist das kommentierte Pojo:

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

Hier ist die Jersey -Ressource:

@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 "{}";
 }
}

Hier ist meine Frühlingsbohne:

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

Die Ausgabe ist genau das, was ich brauche. Mit JSONViews kann ich anpassen, welche Felder für verschiedene Situationen ausgegeben werden.

Hoffentlich hilft dies jemand anderem!

Andere Tipps

Dies hat sich geändert, seit die akzeptierte Antwort geschrieben wurde.

Wenn Sie das PojomappingFeature einschalten, wird der ObjectMapper automatisch von Jersey aufgerufen. In einer Servlet -Umgebung finden Sie Folgendes in Ihrer Jersey -Definition:

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

Sie können jetzt einfach die Feeds vom Endpunkt aus zurückgeben.

@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<CalendarFeeds> getCalendars() {
    Member member = memberService.getCurrentMember();
    return member.getCalendarFeeds();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top