Question

J'utilise Jersey et que vous voulez afficher ce qui suit JSON uniquement avec les champs indiqués:

[
    {
      "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 je dois, je peux entourer que JSON avec { « flux »: ...}, mais avoir ce soit en option serait le mieux. Je veux tirer ces informations à partir d'une liste de CalendarFeeds qui sont stockés dans un POJO membre qui est récupéré via Hibernate. Voici les POJO simplifiées:

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

À l'heure actuelle, j'ai une ressource de Jersey appelé CalendarResource qui sort manuellement JSON avec le calendrier flux d'informations:

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

Mais je ne suis pas sûr de savoir comment s'y prendre pour l'automatisation de ce. Je viens juste de commencer à utiliser Jersey et je suis pas clair sur la façon de l'utiliser pour revenir JSON. On dirait qu'il a une façon de le faire construit, mais il semble que je dois ajouter des annotations à mes POJO. En outre, je lis d'autres en disant que je dois utiliser Jackson. J'ai été googler et ne peut pas sembler trouver un bon exemple et simple de retour JSON d'une ressource de Jersey. Tout le monde sait de tout? Ou pouvez-vous me montrer comment utiliser Jackson ou Jersey pour créer JSON pour pour l'exemple ci-dessus?

Était-ce utile?

La solution

Je me suis dit comment faire cela en utilisant Jackson 1.4. Je ne suis pas en utilisant jersey JSON car il est basé sur une version plus ancienne de Jackson et je besoin de la version 1.4 à utiliser JsonViews.

Voici le POJO annotée:

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

Voici la ressource en 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 "{}";
 }
}

Voici mon grain de printemps:

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

La sortie est exactement ce que je dois. Et en utilisant JsonViews, je peux personnaliser les champs obtenir une sortie pour différentes situations.

Espérons que cela vous aidera quelqu'un d'autre!

Autres conseils

Cela a changé depuis a écrit la réponse acceptée.

Si vous activez la pojoMappingFeature la objectMapper sera automatiquement appelé par le maillot. Dans un environnement de servlet, procédez comme suit dans la définition de votre maillot:

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

Vous pouvez maintenant revenir simplement les flux du point final.

@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<CalendarFeeds> getCalendars() {
    Member member = memberService.getCurrentMember();
    return member.getCalendarFeeds();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top