Java 如何从Jersey资源生成JSON?

Java 如何从Jersey资源生成JSON?,java,json,rest,jersey,jackson,Java,Json,Rest,Jersey,Jackson,我正在使用Jersey并希望输出以下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/ca

我正在使用Jersey并希望输出以下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"
    }
]
如果必须的话,我可以用{“feeds”:…}来包围JSON,但最好是让它成为可选的。我想从通过Hibernate检索的成员POJO中存储的CalendarFeed列表中提取此信息。以下是简化的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;
}

但我不知道如何实现自动化。我刚刚开始使用Jersey,不清楚如何使用它返回JSON。听起来它有一种内置的方法来实现这一点,但看起来我需要在POJO中添加注释。此外,我还看到其他人说我需要使用Jackson。我一直在谷歌上搜索,似乎找不到一个从Jersey资源返回JSON的简单好例子。有人知道吗?或者,您能告诉我如何使用Jackson或Jersey为上述示例创建JSON吗?

我知道如何使用Jackson 1.4实现这一点。我没有使用jersey json,因为它基于旧版本的Jackson,我需要1.4版来使用JsonViews

以下是带注释的pojo:

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,我可以定制在不同情况下哪些字段得到输出


希望这能帮助其他人

自从被接受的答案被写下来后,情况发生了变化

如果启用pojoMappingFeature,objectMapper将由jersey自动调用。在servlet环境中,在jersey定义中执行以下操作:

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

com.sun.jersey.api.json.POJOMappingFeature
真的
现在,您只需从端点返回提要

@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<CalendarFeeds> getCalendars() {
    Member member = memberService.getCurrentMember();
    return member.getCalendarFeeds();
}
@GET
@产生(MediaType.APPLICATION_JSON)
公共集合getCalendars(){
Member Member=memberService.getCurrentMember();
返回成员.getCalendarFeeds();
}

谢谢。这个解决方案简单而优雅。
@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<CalendarFeeds> getCalendars() {
    Member member = memberService.getCurrentMember();
    return member.getCalendarFeeds();
}