【问题标题】:How to generate JSON from a Jersey resource?如何从泽西岛资源生成 JSON?
【发布时间】:2011-01-08 10:44:57
【问题描述】:

我正在使用 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 检索的 Member POJO 中的 CalendarFeeds 列表中提取此信息。以下是简化的 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 的 Jersey 资源,它手动输出带有日历提要信息的 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();
    }
}

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

【问题讨论】:

    标签: java json rest jersey jackson


    【解决方案1】:

    我想出了如何使用 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,我可以自定义在不同情况下输出哪些字段。

    希望这对其他人有帮助!

    【讨论】:

      【解决方案2】:

      自从写出接受的答案后,情况发生了变化。

      如果您打开 pojoMappingFeature,则 jersey 将自动调用 objectMapper。在 servlet 环境中,在您的球衣定义中执行以下操作:

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

      【讨论】:

      • 谢谢。这个解决方案简单而优雅。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2015-01-05
      • 2016-05-07
      相关资源
      最近更新 更多