2010-01-23 58 views
10

我使用的是新澤西州和要輸出只有各字段的內容JSON上市:如何從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" 
    } 
] 

如果必須這樣,我可以圍繞該JSON與{「飼料」:...},但有這是可選的將是最好的。我想從存儲在通過Hibernate檢索的成員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澤西島的資源,手動輸出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?

回答

8

我想出瞭如何使用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 "{}"; 
} 
} 

這裏是我的Spring bean:

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

輸出正是我所需要的。並且使用JsonViews,我可以自定義哪些字段可以在不同情況下獲得輸出。

希望這會幫助別人!

6

自接受的答案寫入以來,這已發生變化。

如果你打開pojoMappingFeature,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(); 
} 
+0

謝謝。這個解決方案簡單而優雅。 – tonga 2013-07-05 02:51:52