ジャージーリソースから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"
}
]
必要に応じて、{「フィード」:...}でそのjsonを囲むことができますが、これをオプションにするのが最善です。この情報は、冬眠を介して取得されたメンバーのポジョに保存されているカレンダーフィードのリストから引き出したいと思います。ここに簡略化されたポジョがあります:
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;
}
現在、CalenderResourceと呼ばれるジャージーリソースがあり、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を返す良い例を見つけることができないようです。誰かが何か知っていますか?または、ジャクソンやジャージを使用して上記の例のためにJSONを作成する方法を教えていただけますか?
解決
ジャクソン1.4を使用してこれを行う方法を見つけました。 Jacksonの古いバージョンに基づいているため、Jersey-Jsonを使用していません。JsonViewsを使用するにはバージョン1.4が必要でした。
これが注釈付きのポジョです:
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をオンにすると、オブジェクトマッパーはジャージーによって自動的に呼び出されます。サーブレット環境では、ジャージーの定義内で次のことを行います。
<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();
}