2010-01-23 2 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를 통해 검색된 Member POJO에 저장된 CalendarFeeds 목록에서 가져 오려고합니다. 여기에 간단한 POJO를이 : 현재, 내가 수동으로 캘린더와 JSON을 출력 CalendarResource라는 저지 자원을 가지고

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; 
} 

하는 정보 피드 :

@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에 주석을 추가해야하는 것처럼 보입니다. 또한 잭슨을 사용할 필요가 있다고 말하는 사람들을 읽었습니다. 나는 인터넷 검색을 해왔고 Jersey 리소스에서 JSON을 반환하는 좋은 간단한 예제를 찾지 못하는 것 같습니다. 누구든지 알고 있습니까? 아니면 위의 예제에서 JSON을 만들기 위해 Jackson 또는 Jersey를 사용하는 방법을 보여줄 수 있습니까?

답변

8

Jackson 1.4를 사용하여이를 수행하는 방법을 알았습니다. jersey-json은 Jackson의 이전 버전을 기반으로하므로 JsonViews를 사용하려면 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입니다 . 그리고 JsonViews를 사용하여 다양한 상황에 맞게 어떤 필드를 출력할지 사용자 정의 할 수 있습니다.

다른 사람에게 도움이되기를 바랍니다.

6

답변이 작성된 이후로 변경되었습니다.

pojoMappingFeature를 켜면 objectMapper가 저지에 의해 자동으로 호출됩니다. 서블릿 환경에서 저지 정의 내부에서 다음을 수행하십시오.

<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

관련 문제