Как сгенерировать JSON из ресурса Джерси? - PullRequest
11 голосов
/ 23 января 2010

Я использую Джерси и хочу вывести следующий JSON только с указанными полями:

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

Если нужно, я могу окружить этот JSON {"feeds": ...},но иметь это было бы необязательно, было бы лучше.Я хочу получить эту информацию из списка CalendarFeeds, которые хранятся в POJO члена, который извлекается через Hibernate.Вот упрощенные POJO:

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

В настоящее время у меня есть ресурс Джерси CalendarResource, который вручную выводит JSON с информацией о фидах календаря:

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

Но я неуверен, как это автоматизировать.Я только начинаю использовать Джерси, и не ясно, как использовать его для возврата JSON.Похоже, у него есть способ сделать это встроенным, но, похоже, мне нужно добавить аннотации к моим POJO.Кроме того, я читал, что другие говорят, что мне нужно использовать Джексона.Я гуглил и не могу найти хороший и простой пример возврата JSON из ресурса Джерси.Кто-нибудь знает что-нибудь?Или вы можете показать мне, как использовать Джексона или Джерси для создания JSON для приведенного выше примера?

Ответы [ 2 ]

8 голосов
/ 24 января 2010

Я понял, как это сделать, используя Джексон 1.4. Я не использую jersey-json, поскольку он основан на более старой версии Jackson, и мне нужна была версия 1.4 для использования JsonViews.

Вот аннотированное пойо:

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

Вот ресурс Джерси:

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

Вот моя фасоль:

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

Вывод - именно то, что мне нужно. А с помощью JsonViews я могу настроить, какие поля будут выводиться для различных ситуаций.

Надеюсь, это поможет кому-то еще!

6 голосов
/ 28 июня 2013

Это изменилось с момента написания принятого ответа.

Если вы включите pojoMappingFeature, objectMapper будет автоматически вызываться джерси. В среде сервлетов сделайте следующее в своем определении джерси:

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

Теперь вы можете просто возвращать каналы из конечной точки.

@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<CalendarFeeds> getCalendars() {
    Member member = memberService.getCurrentMember();
    return member.getCalendarFeeds();
}
...