如何从泽西岛资源生成 JSON?
Posted
技术标签:
【中文标题】如何从泽西岛资源生成 JSON?【英文标题】:How to generate JSON from a Jersey resource? 【发布时间】: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?
【问题讨论】:
【参考方案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();
【讨论】:
谢谢。这个解决方案简单而优雅。以上是关于如何从泽西岛资源生成 JSON?的主要内容,如果未能解决你的问题,请参考以下文章