2010-07-14 2 views
8

Jersey JAX-RS의 일부인 JAXB를 사용하고 있습니다. 내 출력 유형에 JSON을 요청하면 내 모든 속성 이름은 다음과 같은 별표로 시작합니다.Jersey를 사용하여 @에서 JSON으로 이름이 반환되는 이유

package com.ups.crd.data.objects; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlType; 

@XmlType 
public class ResponseDetails { 
    @XmlAttribute public String ReturnCode = ""; 
    @XmlAttribute public String StatusMessage = ""; 
    @XmlAttribute public String TransactionDate =""; 
} 

이된다,

{"ResponseDetails":{"@transactionDate":"07-12-2010", 
      "@statusMessage":"Successful","@returnCode":"0"} 

그래서, 왜 이름이 @ 있습니까?

답변

9

@XmlAttribute로 매핑 된 모든 속성의 접두어는 JSON에서 '@'입니다. 그것을 제거하고 싶다면 단순히 @XmlElement로 속성에 주석을 달았습니다. XML과 JSON 모두에 정렬 화하는 경우

@XmlAttribute(name="foo") public String prop1; // maps to @foo in JSON 
@XmlElement(name="foo") public String prop2; // maps to foo in JSON 
+0

나를 위해 작동하지 않습니다! '@XmlAttribute'를 사용하면 필드 앞에 @를 붙이며'@XmlElement'를 사용하면 출력이 없습니다! – sajjadG

1

, 당신은 다음 제안이 사용하는 XML 버전 속성으로 필요하지 않은 @XmlElement :

은 아마도이 잠재적 이름 충돌을 방지하는 것입니다 최선의 방법입니다.

그러나 XML 버전의 속성 (요소가 아닌) 일 필요가 있다면 매우 쉬운 대안이 있습니다.

"@"삽입을 끄는 JSONConfiguration을 쉽게 설정할 수 있습니다.

그것은 다음과 같이 보일 것입니다 :

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 
private JAXBContext context; 

public JAXBContextResolver() throws Exception { 
    this.context= new JSONJAXBContext(
     JSONConfiguration 
      .mapped() 
      .attributeAsElement("StatusMessage",...) 
      .build(), 
      ResponseDetails.class); 
} 

@Override 
public JAXBContext getContext(Class<?> objectType) { 
    return context; 
} 
} 

도 여기에 몇 가지 다른 대안 문서가 있습니다

http://jersey.java.net/nonav/documentation/latest/json.html 당신은 ""JAXBContext 구성에 JSON_ATTRIBUTE_PREFIX을 설정해야

+0

링크가 끊어졌습니다. 최신 저지 문서를 확인했는데 거기에'JSONConfiguration'에 대한 정보는 없습니다! – sajjadG

0

기본적으로하는 "@" :

properties.put(JAXBContextProperties.JSON_ATTRIBUTE_PREFIX, ""); 
관련 문제