سؤال

أنا أستخدم جيرسي وأريد إخراج 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": ...} ، ولكن سيكون ذلك اختياريًا سيكون من الأفضل. أرغب في سحب هذه المعلومات من قائمة التقويمات التي يتم تخزينها في عضو في 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;
}

حاليًا ، حصلت على مورد Jersey يسمى 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. يبدو أنه يحتوي على طريقة للقيام بذلك ، لكن يبدو أنني بحاجة إلى إضافة تعليقات توضيحية إلى Pojos. أيضا ، قرأت الآخرين قائلين أنني بحاجة إلى استخدام جاكسون. لقد كنت غوغلينغ ولا يمكنني تحديد موقع مثال جيد وبسيط لإرجاع JSON من مورد Jersey. أي شخص يعرف أي؟ أو هل يمكنك أن تريني كيفية استخدام جاكسون أو جيرسي لإنشاء JSON للمثال أعلاه؟

هل كانت مفيدة؟

المحلول

اكتشفت كيفية القيام بذلك باستخدام جاكسون 1.4. أنا لا أستخدم Jersey-Json لأنه يعتمد على إصدار أقدم من Jackson وكنت بحاجة إلى الإصدار 1.4 لاستخدام JsonViews.

ها هو بوجو المشروح:

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 ، فسيتم استدعاء Jersey تلقائيًا بواسطة Jersey. في بيئة 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top