2010-01-23 15 views
10

Sto usando Jersey e vuole l'uscita seguente JSON con solo i campi elencati:Come generare JSON da una risorsa Jersey?

[ 
    { 
     "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 questa essere facoltativo sarebbe il migliore Voglio estrarre queste informazioni da un elenco di CalendarFeed archiviati 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; 
} 

Attualmente, ho una risorsa Jersey chiamato CalendarResource che emette manualmente JSON con il calendario alimenta 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 sull'automazione di questo. Sto solo iniziando a utilizzare Jersey e non sono chiaro su come usarlo per restituire JSON. Sembra che abbia un modo per farlo, ma sembra che ho bisogno di aggiungere annotazioni ai miei POJO. Inoltre, leggo gli altri dicendo che devo usare Jackson. Sono stato googling e non riesco a trovare un buon esempio di restituire JSON da una risorsa di Jersey. Qualcuno sa di qualsiasi? O puoi mostrarmi come usare Jackson o Jersey per creare JSON per l'esempio sopra?

risposta

8

Ho capito come farlo usando Jackson 1.4. Non sto usando jersey-json poiché si basa su una versione precedente di Jackson e avevo bisogno della versione 1.4 per usare 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 il mio fagiolo primavera:

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

L'uscita è esattamente quello che mi serve . E usando JsonViews, posso personalizzare quali campi ottengono risultati per situazioni diverse.

Speriamo che questo aiuti qualcun altro!

6

Questo è cambiato da quando è stata scritta la risposta accettata.

Se si accende la funzione pojoMapping, objectMapper verrà automaticamente richiamato dalla 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(); 
} 
+0

Grazie. Questa soluzione è semplice ed elegante. – tonga

Problemi correlati