2017-05-04 2 views
1

:역 직렬화 내부 부분은 다음 (간체) 형식으로 XML을 감안할 때

<outer><inner><field1>a</field1><field2>b</field2><field3>c</field3></inner></outer> 

나는 그것을 나타내는 클래스로 <inner> 요소를 역 직렬화하고 나머지는 폐기하고 싶습니다.

public class Inner { 
    private String field1; 
    private String field2; 
    private String field3; 
    // getters, setters, ctor 
} 

나는 역 직렬화를 수행하기 위해 Jackson XmlMapper 클래스를 사용하고 있습니다. xml 문자열에서 <outer>을 제거하면 분명히 작동합니다.

XmlMapper xmlMapper = new XmlMapper(); 
// in my scenario the `<inner>` element actually contains fields I don't care about 
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
Inner inner = xmlMapper.readValue(xml, Inner.class); 
System.out.println(inner); 
// Inner(field1=a, field2=b, field3=c) 

나는 inner의 모든 필드가 null 인 <outer> 요소를두면.

Inner 클래스에 @JacksonXmlRootElement(localName = "inner")으로 주석을 달았지만 출력이 변경되지 않았습니다.

나는 <outer> 요소를 나타내는 클래스를 만들 수 있지만 이는 낭비적인 것처럼 보입니다. <inner> 요소 사이의 xml을 포함하는 새로운 문자열을 만들 수도 있지만 다시 약간의 해킹을 느낍니다.

제 경우에는 xml이 제어 할 수없는 별도의 시스템에서 브로드 캐스팅되므로 xml 구조를 간단히 수정할 수 있습니다.

"내부"XML을 새로운 클래스 인스턴스로 deserialize 할 수 있습니까?

답변

1

@JacksonXmlRootElement(localName = "inner")이 예상대로 작동하는 것 같습니다. UNWRAP_ROOT_VALUE. 예 :

xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

위의 내용이 문서에서 매우 분명하다고 말할 수는 없습니다.

+0

감사합니다. 기능이 핵심이었던 것 같습니다. –