2012-06-14 5 views
4

Jersey + Jackon을 사용하여 JSON에서 작동하는 REST API를 만들고 있습니다.Jackson/Jaxb에서 요소 풀기

@XmlRootElement 
public class A { 
    public String s; 
} 

을 여기에 클래스를 사용하여 내 저지 방법 :

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Object get(@PathParam("id") String id) throws Exception{ 
    A[] a= new A[2]; 
    a[0] = new A(); 
    a[0].s="abc"; 
    a[1] = new A(); 
    a[1].s="def"; 
    return a; 
} 

아웃 풋은 다음과 같습니다

{"a":[{"s":"abc"},{"s":"def"}]} 

다음과 같이 I 클래스가 있다고 가정 하지만 나는 이렇게하기를 원해.

[{"s":"abc"},{"s":"def"}] 

어떻게해야합니까? 도와주세요.

+0

나는 다른 방법으로 물건을 얻고 있습니다. 나는 첫번째 것을 원한다. 그것을 어떻게 성취 할 수 있습니까? 상대방은 그런 식으로 기대하고 있습니다. – theGamblerRises

답변

0

첫 번째 것은 유효한 JSON 문자열입니다.

두 번째는 아닙니다.

+0

외부의 제약 때문에 두 번째 것을 사용해야합니다. – Morteza

2

귀하의 요구 사항은 json 문자열에서 루트 요소를 삭제하는 것으로 보입니다. 이것은 Jersey에서 다음과 같이 구성 할 수 있습니다. Jersey에서는 루트 요소를 삭제할지 여부를 JSONConfiguration.rootUnwrapping()으로 구성합니다. 자세한 내용은 JSON support in Jersey and CXF에서 확인할 수 있습니다.

다음은이 작업을 수행하는 샘플 코드입니다.

@Provider 
    public class MyJAXBContextResolver implements ContextResolver<JAXBContext> { 

     private JAXBContext context; 
     private Class[] types = {StatusInfoBean.class, JobInfoBean.class}; 

     public MyJAXBContextResolver() throws Exception { 
      this.context = new JSONJAXBContext(
        JSONConfiguration.mapped() 
             .rootUnwrapping(true) 
             .arrays("jobs") 
             .nonStrings("pages", "tonerRemaining") 
             .build(), 
        types); 
     } 

     public JAXBContext getContext(Class<?> objectType) { 
      return (types[0].equals(objectType)) ? context : null; 
     } 
    } 
+0

저는 Jersey + Jackson을 처음 사용합니다. 이 코드를 어떻게 사용해야하는지 알려주시겠습니까? – Morteza

+0

알다시피, 이것은 JAX-RS 어휘의'@ Provider'입니다. 그래서 이것을 공급자로 등록하십시오. –

+0

나는이 과정이 저지에서 약간 복잡하다는 것을 이해한다. CXF에서 구성은 매우 쉽습니다. 빈 파일을 통해 CXF와 함께 제공되는 기본 json 공급자를 구성하면됩니다. 콩이 어떻게 사용되는지 인터넷에 많은 샘플이 있습니다. –

0

당신은 관련 <servlet> 노드 아래에, 당신의 web.xml에 다음을 추가 시도해 볼 수도 있습니다 :

<init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
</init-param> 

The Jersey documentation이 설정에 대한 자세한 정보가 있습니다.

이 기능은 Jersey 1.4에 도입되었으며 Jackson에 종속됩니다. Glassfish 3.0.1 이하 버전을 번들로 사용하는 경우 follow the upgrade instructions이 필요합니다.

+0

자세한 내용은 "잭슨에 의존합니다."(jersey-media-json-jackson dependency) : http://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson –

+0

how how jackson을 저지에 등록하는 방법 : https://jersey.java.net/nonav/documentation/latest/user-guide.html#jackson-registration –