2013-10-24 1 views
6

나머지 서비스는잭슨 루트를 unwraping와 JSON을 구문 분석,하지만 @JsonRootName

<transaction><trxNumber>1243654</trxNumber><type>INVOICE</type></transaction> 

또는 JSON에 응답 설정 기능없이 :

{"transaction":{"trxNumber":1243654,"type":"INVOICE"}} 

을 내가 사용하는 경우에는 문제가 없습니다 :

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true) 

그리고 결과 클래스

@JsonRootName("transaction") 
public class Transaction { 
private String trxNumber; 
private String type; 
//getters and setters 
} 

실제로 제 3 자 jar의 Transaction 클래스를 사용해야합니다. 정확히 위의 과 같지만 @JsonRootName ("transaction") 주석은 없습니다.

그래서 나는 잭슨이 트랜잭션 클래스에 구문 분석 강제로 어떤 방법이 트랜잭션 클래스 자체에 어떤 물건을 추가하지 않고 거기에

Could not read JSON: Root name 'transaction' does not match expected ('Transaction') for type... 

와 끝까지 (I 이진 단지의 일부로이 파일을 얻을로) ?

사용자 정의 PropertyNamingStrategy를 시도했지만 필드 및 getter/setter 이름 만 사용하면되지만 클래스 이름은 사용하지 않는 것처럼 보입니다.

Java7, Jackson 2.0.5.

제안 사항? 감사.

답변

5

mixin 기능으로 수행 할 수 있습니다. 이 같은 간단한 인터페이스/추상 클래스를 만들 수 있습니다

@JsonRootName("transaction") 
interface TransactionMixIn { 

} 

을 지금, 당신은 ObjectMapper 개체를 구성해야합니다 :

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
mapper.addMixInAnnotations(Transaction.class, TransactionMixIn.class); 

을 그리고 마지막으로 당신은 JSON 직렬화하는 데 사용할 수 있습니다 :

mapper.readValue(json, Transaction.class); 

두 번째 옵션 - Transaction 클래스에 custom deserializer을 쓸 수 있습니다.

+1

좋아요! 대답을 많이 주셔서 감사합니다. 마지막으로 우리는 TransactionWrapper 객체와 함께 가서 트랜잭션 필드에 @JsonRootName ("transaction")을 넣으려고했지만 제안은 매우 흥미 롭습니다! –

+0

'TransactionWrapper'는 좋은 소리입니다. 나는 그것에 대해서도 생각했다. 어쨌든 믹스 인 기능을 재사용하여 향후 다른 문제를 해결할 수 있습니다. –