2010-01-23 60 views
10

我使用的是新泽西州和要输出只有各字段的内容JSON上市:如何从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" 
    } 
] 

如果必须这样,我可以围绕该JSON与{“饲料”:...},但有这是可选的将是最好的。我想从存储在通过Hibernate检索的成员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泽西岛的资源,手动输出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?

回答

8

我想出了如何使用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 "{}"; 
} 
} 

这里是我的Spring bean:

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

输出正是我所需要的。并且使用JsonViews,我可以自定义哪些字段可以在不同情况下获得输出。

希望这会帮助别人!

6

自接受的答案写入以来,这已发生变化。

如果你打开pojoMappingFeature,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(); 
} 
+0

谢谢。这个解决方案简单而优雅。 – tonga 2013-07-05 02:51:52