如何从球衣资源中生成JSON?
题
我正在使用泽西岛,并希望输出以下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中的calendarfeeds列表中获取此信息。这是简化的pojos:
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;
}
当前,我有一个名为calendarsource的球衣资源,该资源用日历供给信息手动输出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。听起来好像可以做到这一点,但是看来我需要在波约斯添加注释。另外,我读到其他人说我需要使用杰克逊。我一直在谷歌搜索,似乎找不到一个很好而简单的例子,即从球衣资源中返回JSON。有人知道吗?还是可以告诉我如何使用Jackson或Jersey为上述示例创建JSON?
解决方案
我使用杰克逊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,则泽西岛将自动调用对象贴图。在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();
}
不隶属于 StackOverflow