11

私はジャージーを使用しており、リストされたフィールドのみを含む次の 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 を {"feeds": ... } で囲むことができますが、これはオプションにするのが最善です。この情報を、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;
}

現在、カレンダー フィード情報を含む JSON を手動で出力する CalendarResource というジャージー リソースがあります。

@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 を返す方法が明確ではありません。これを行う方法が組み込まれているように思えますが、POJO に注釈を追加する必要があるようです。また、ジャクソンを使用する必要があると他の人が言っているのを読みました。私はグーグルで検索してきましたが、Jersey リソースから JSON を返す良い単純な例を見つけることができないようです。誰でも知っていますか?または、Jackson または Jersey を使用して上記の例の JSON を作成する方法を教えていただけますか?

4

2 に答える 2

8

Jackson1.4を使用してこれを行う方法を理解しました。jersey-jsonは古いバージョンのJacksonに基づいており、JsonViewsを使用するにはバージョン1.4が必要だったため、使用していません。

注釈付きの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を使用して、さまざまな状況で出力されるフィールドをカスタマイズできます。

うまくいけば、これは他の誰かを助けるでしょう!

于 2010-01-24T08:42:22.810 に答える
6

これは、受け入れられた回答が書かれてから変更されました。

pojoMappingFeature をオンにすると、objectMapper が jersey によって自動的に呼び出されます。サーブレット環境では、jersey 定義内で次の操作を行います。

<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();
}
于 2013-06-28T17:04:23.543 に答える