Domanda

Sto usando Jersey e vuole l'uscita seguente JSON con solo i campi elencati:

[
    {
      "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 circondare che JSON con { "feed": ...}, ma avendo questo essere opzionale sarebbe meglio. Voglio tirare queste informazioni da un elenco di CalendarFeeds che vengono memorizzati in un POJO membro che viene recuperato tramite Hibernate. Ecco i POJO semplificate:

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

Al momento, ho una risorsa Jersey chiamato CalendarResource che emette manualmente JSON con il calendario feed informazioni:

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

Ma io non sono sicuro di come fare per automatizzare questo. Sto solo cominciando a usare Jersey e non mi è chiaro su come utilizzarlo per restituire JSON. Sembra che ha un modo di fare questo integrato, ma sembra che ho bisogno di aggiungere annotazioni ai miei POJO. Inoltre, ho letto gli altri dicendo che ho bisogno di usare Jackson. Sono stato googling e non riesco a trovare una buona e semplice esempio di ritorno JSON da una risorsa Jersey. Qualcuno sa di qualsiasi? Oppure mi puoi mostrare come utilizzare Jackson o Jersey per creare JSON per per l'esempio di cui sopra?

È stato utile?

Soluzione

ho capito come fare questo usando Jackson 1.4. Non sto usando jersey-JSON in quanto si basa su una versione precedente di Jackson e avevo bisogno versione 1.4 di utilizzare JsonViews.

Ecco il POJO annotati:

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

Qui è la risorsa Maglia:

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

Ecco la mia fagioli primavera:

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

L'uscita è esattamente quello che mi serve. E l'utilizzo di JsonViews, posso personalizzare quali campi ottenere output per situazioni diverse.

Speriamo che questo vi aiuterà qualcun altro!

Altri suggerimenti

Questa è cambiato da quando la risposta accettata è stato scritto.

Se si accende il pojoMappingFeature l'ObjectMapper verrà richiamato automaticamente dal jersey. In un ambiente servlet effettuare le seguenti operazioni all'interno della vostra definizione Maglia:

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

È ora possibile semplicemente restituire i feed dal punto finale.

@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<CalendarFeeds> getCalendars() {
    Member member = memberService.getCurrentMember();
    return member.getCalendarFeeds();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top