2010-01-23 13 views
10

मैं जर्सी का उपयोग कर रहा है और उत्पादन करना चाहते हैं सूचीबद्ध केवल क्षेत्रों के साथ निम्नलिखित 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 के साथ घेर कर सकते हैं { "फ़ीड": ...}, लेकिन यह होने वैकल्पिक होना सबसे अच्छा होगा। मैं इस जानकारी को कैलेंडर फीड्स की एक सूची से खींचना चाहता हूं जो एक सदस्य POJO में संग्रहीत हैं जो हाइबरनेट के माध्यम से पुनर्प्राप्त किया जाता है। यहाँ सरलीकृत 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; 
} 

वर्तमान में, मैं एक जर्सी संसाधन 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(); 
    } 
} 

लेकिन मुझे यकीन है कि कैसे जाने के लिए नहीं कर रहा हूँ इसे स्वचालित करने के बारे में। मैं सिर्फ जर्सी का उपयोग करना शुरू कर रहा हूं और JSON को वापस करने के लिए इसका उपयोग कैसे करें इस पर स्पष्ट नहीं हूं। ऐसा लगता है कि इसमें ऐसा करने का एक तरीका है, लेकिन ऐसा लगता है कि मुझे अपने पीओजेओ में एनोटेशन जोड़ने की जरूरत है। इसके अलावा, मैंने दूसरों को यह कहते हुए पढ़ा कि मुझे जैक्सन का उपयोग करने की आवश्यकता है। मैं गुगल रहा हूं और जर्सी संसाधन से JSON लौटने का एक अच्छा और सरल उदाहरण ढूंढ नहीं सकता। किसी को भी पता है? या क्या आप मुझे दिखा सकते हैं कि ऊपर दिए गए उदाहरण के लिए JSON बनाने के लिए जैक्सन या जर्सी का उपयोग कैसे करें?

उत्तर

8

मुझे पता चला कि जैक्सन 1.4 का उपयोग करके इसे कैसे किया जाए। मैं जर्सी-जेसन का उपयोग नहीं कर रहा हूं क्योंकि यह जैक्सन के पुराने संस्करण पर आधारित है और मुझे जेसन व्यू का उपयोग करने के लिए संस्करण 1.4 की आवश्यकता है।

<!-- Jackson JSON ObjectMapper --> 
<bean id="objectMapper" class="org.codehaus.jackson.map.ObjectMapper"/> 

उत्पादन बिल्कुल मैं क्या जरूरत है:

@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 "{}"; 
} 
} 

यहाँ मेरी वसंत सेम है:

public class CalendarFeed { 
    public enum FeedType { GCAL, EVENT }; 
    @JsonIgnore 
    private Member owner; 
    private String name; 
    private String value; 
    @JsonIgnore 
    private FeedType type; 
} 

यहाँ जर्सी संसाधन है:

यहाँ एनोटेट POJO है । और जेसन व्यू का उपयोग करके, मैं विभिन्न स्थितियों के लिए आउटपुट प्राप्त करने के लिए अनुकूलित कर सकता हूं।

उम्मीद है कि यह किसी और की मदद करेगा!

6

स्वीकृत उत्तर लिखा गया था, यह बदल गया है।

यदि आप 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(); 
} 
+0

धन्यवाद। यह समाधान सरल और सुरुचिपूर्ण है। – tonga

संबंधित मुद्दे