Jackson을 사용한 XML 직렬화 및 역 직렬화

1. 개요

이 튜토리얼에서는 Jackson 2.x를 사용하여 Java 객체를 XML 데이터로 직렬화하고 다시 POJO로 역 직렬화하는 방법 을 살펴볼 것 입니다.

많은 복잡성이나 사용자 정의가 필요하지 않은 기본 작업에 중점을 둘 것입니다.

2. XmlMapper 개체

XmlMapper 는 직렬화에 도움이되는 Jackson 2.x의 기본 클래스이므로 인스턴스를 만들어야합니다.

XmlMapper mapper = new XmlMapper();

매퍼jackson-dataformat-xml jar 에서 사용할 수 있으므로 pom.xml에 종속성으로 추가해야합니다 .

 com.fasterxml.jackson.dataformat jackson-dataformat-xml 2.11.1 

Maven 저장소에서 jackson-dataformat-xml 종속성의 최신 버전을 확인하세요.

3. Java를 XML로 직렬화

XmlMapper 는 JSON 직렬화에 사용되는 ObjectMapper 의 하위 클래스입니다 . 그러나 부모 클래스에 일부 XML 특정 조정을 추가합니다.

이제이를 사용하여 실제 직렬화를 수행하는 방법을 살펴볼 수 있습니다. 먼저 Java 클래스를 생성 해 보겠습니다.

class SimpleBean { private int x = 1; private int y = 2; //standard setters and getters }

3.1. XML 문자열로 직렬화

Java 객체를 XML String 으로 직렬화 할 수 있습니다 .

@Test public void whenJavaSerializedToXmlStr_thenCorrect() throws JsonProcessingException { XmlMapper xmlMapper = new XmlMapper(); String xml = xmlMapper.writeValueAsString(new SimpleBean()); assertNotNull(xml); }

결과적으로 다음을 얻을 수 있습니다.

 1 2 

3.2. XML 파일로 직렬화

Java 객체를 XML 파일로 직렬화 할 수도 있습니다.

@Test public void whenJavaSerializedToXmlFile_thenCorrect() throws IOException { XmlMapper xmlMapper = new XmlMapper(); xmlMapper.writeValue(new File("simple_bean.xml"), new SimpleBean()); File file = new File("simple_bean.xml"); assertNotNull(file); }

아래에서 simple_bean.xml 이라는 결과 파일의 내용을 볼 수 있습니다 .

 1 2 

4. XML을 Java로 역 직렬화

이 섹션에서는 XML에서 Java 객체를 얻는 방법을 살펴 보겠습니다.

4.1. XML 문자열에서 역 직렬화

직렬화와 마찬가지로 XML 문자열을 Java 객체로 역 직렬화 할 수도 있습니다.

@Test public void whenJavaGotFromXmlStr_thenCorrect() throws IOException { XmlMapper xmlMapper = new XmlMapper(); SimpleBean value = xmlMapper.readValue("12", SimpleBean.class); assertTrue(value.getX() == 1 && value.getY() == 2); }

4.2. XML 파일에서 역 직렬화

마찬가지로 XML 파일이있는 경우 다시 Java 객체로 변환 할 수 있습니다.

여기서는 먼저 파일을 입력 스트림으로 읽은 다음 간단한 유틸리티 메서드 를 사용하여 입력 스트림을 문자열 로 변환합니다 .

나머지 코드는 섹션 4.1의 코드와 유사합니다.

@Test public void whenJavaGotFromXmlFile_thenCorrect() throws IOException { File file = new File("simple_bean.xml"); XmlMapper xmlMapper = new XmlMapper(); String xml = inputStreamToString(new FileInputStream(file)); SimpleBean value = xmlMapper.readValue(xml, SimpleBean.class); assertTrue(value.getX() == 1 && value.getY() == 2); }

유틸리티 방법 :

public String inputStreamToString(InputStream is) throws IOException { StringBuilder sb = new StringBuilder(); String line; BufferedReader br = new BufferedReader(new InputStreamReader(is)); while ((line = br.readLine()) != null) { sb.append(line); } br.close(); return sb.toString(); }

5. 대문자 요소 처리

이 섹션에서는 역 직렬화 할 요소가 대문자로 된 XML이 있거나 하나 이상의 요소가 대문자로 된 XML로 Java 객체를 직렬화해야하는 시나리오를 처리하는 방법을 살펴 보겠습니다.

5.1. XML 문자열 에서 역 직렬화

하나의 필드가 대문자로 표시된 XML이 있다고 가정 해 보겠습니다.

 1 2 

대문자로 된 요소를 올바르게 처리하려면 @JsonProperty 주석으로 "x"필드에 주석을 추가해야합니다 .

class SimpleBeanForCapitalizedFields { @JsonProperty("X") private int x = 1; private int y = 2; // standard getters, setters }

이제 XML 문자열 을 Java 객체로 다시 올바르게 역 직렬화 할 수 있습니다 .

@Test public void whenJavaGotFromXmlStrWithCapitalElem_thenCorrect() throws IOException { XmlMapper xmlMapper = new XmlMapper(); SimpleBeanForCapitalizedFields value = xmlMapper.readValue( "12", SimpleBeanForCapitalizedFields.class); assertTrue(value.getX() == 1 && value.getY() == 2); }

5.2. XML 문자열로 직렬화

@JsonProperty로 필수 필드에 주석을 달면 하나 이상의 대문자 요소가 있는 XML 문자열 로 Java 객체를 올바르게 직렬화 할 수 있습니다 .

@Test public void whenJavaSerializedToXmlFileWithCapitalizedField_thenCorrect() throws IOException { XmlMapper xmlMapper = new XmlMapper(); xmlMapper.writeValue(new File("target/simple_bean_capitalized.xml"), new SimpleBeanForCapitalizedFields()); File file = new File("target/simple_bean_capitalized.xml"); assertNotNull(file); }

6. 목록 을 XML로 직렬화

XmlMapper는 문서에 전체 자바 빈을 직렬화 할 수 있습니다. Java 객체를 XML로 변환하기 위해 중첩 된 객체와 배열을 사용한 간단한 예제를 살펴 보겠습니다.

Our intent is to serialize a Person object, along with its composed Address object, into XML.

Our final XML will look something like:

 Rohan Daye  9911034731 9911033478   Name1 City1   Name2 City2  

Notice that our phone numbers are encapsulated in a phoneNumbers wrapper while our address is not.

We can express this nuance via the @JacksonXMLElementWrapper annotation in our Person class:

public final class Person { private String firstName; private String lastName; private List phoneNumbers = new ArrayList(); @JacksonXmlElementWrapper(useWrapping = false) private List address = new ArrayList(); //standard setters and getters }

Actually, we can change the wrapping element name with @JacksonXmlElementWrapper(localName = ‘phoneNumbers'). Or, if we don't want to wrap our elements, we can disable the mapping with @JacksonXmlElementWrapper(useWrapping = false).

And then let's define our Address type:

public class Address { String streetName; String city; //standard setters and getters }

나머지는 Jackson이 처리합니다. 이전과 마찬가지로 간단히 writeValue를 다시 호출 할 수 있습니다 .

private static final String XML = "..."; @Test public void whenJavaSerializedToXmlFile_thenSuccess() throws IOException { XmlMapper xmlMapper = new XmlMapper(); Person person = testPerson(); // test data ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); xmlMapper.writeValue(byteArrayOutputStream, person); assertEquals(XML, byteArrayOutputStream.toString()); }

7. XML을 목록으로 역 직렬화

Jackson은 객체 목록이 포함 된 XML도 읽을 수 있습니다.

이전과 동일한 XML을 사용하면 readValue 메서드가 제대로 작동합니다.

@Test public void whenJavaDeserializedFromXmlFile_thenCorrect() throws IOException { XmlMapper xmlMapper = new XmlMapper(); Person value = xmlMapper.readValue(XML, Person.class); assertEquals("City1", value.getAddress().get(0).getCity()); assertEquals("City2", value.getAddress().get(1).getCity()); }

8. 결론

이 간단한 기사에서는 간단한 POJO를 XML로 직렬화하고 기본 XML 데이터에서 POJO를 얻는 방법을 설명했습니다.

또한 컬렉션을 포함하는 복잡한 Bean을 직렬화 및 역 직렬화하는 방법도 살펴 보았습니다.

이 기사와 함께 제공되는 소스 코드는 GitHub에서 사용할 수 있습니다.