Сериализация в java xml

Сериализация и десериализация XML с Джексоном

В этом руководстве мы узнаем , как сериализовать объекты Java в XML-данные с помощью Jackson 2.x и десериализовать их обратно в POJO .

Мы сосредоточимся на базовой операции, которая не требует особой сложности или настройки.

2. Объект XmlMapper

XmlMapper — это основной класс из Jackson 2.x, который помогает нам в сериализации, поэтому нам нужно создать его экземпляр:

 XmlMapper mapper = new XmlMapper(); 

Этот преобразователь доступен в jar -файле jackson-dataformat-xml , поэтому мы должны добавить его в качестве зависимости к нашему pom.xml :

 dependency>   groupId>com.fasterxml.jackson.dataformatgroupId>   artifactId>jackson-dataformat-xmlartifactId>   version>2.11.1version>   dependency> 

3. Сериализация Java в XML

XmlMapper — это подкласс ObjectMapper, который используется в сериализации JSON; однако он добавляет в родительский класс некоторые специфичные для XML настройки.

Давайте посмотрим, как использовать его для реальной сериализации. Давайте сначала создадим класс Java:

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

3.1. Сериализация в строку XML

Мы можем сериализовать наш объект Java в строку XML :

 @Test   public void whenJavaSerializedToXmlStr_thenCorrect() throws JsonProcessingException    XmlMapper xmlMapper = new XmlMapper();   String xml = xmlMapper.writeValueAsString(new SimpleBean());   assertNotNull(xml);   > 
 SimpleBean>   x>1x>   y>2y>   SimpleBean> 

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 :

 SimpleBean>   x>1x>   y>2y>   SimpleBean> 

4. Десериализовать XML в Java

В этом разделе мы рассмотрим, как получить объекты Java из XML.

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 с заглавными буквами для десериализации, либо нам нужно сериализовать объекты Java в XML с одним или несколькими элементами с заглавными буквами.

5.1. Десериализовать из строки XML

Допустим, у нас есть XML с одним полем с заглавной буквы:

 SimpleBeanForCapitalizedFields>   X>1X>   y>2y>   SimpleBeanForCapitalizedFields> 

Чтобы правильно обрабатывать элементы с заглавными буквами, нам нужно аннотировать поле «x» аннотацией @JsonProperty :

 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, мы можем правильно сериализовать объект Java в строку XML с одним или несколькими элементами с заглавными буквами:

 @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-бин в документ. Чтобы преобразовать объект Java в XML, мы возьмем простой пример с вложенным объектом и массивами.

Наша цель — сериализовать объект Person вместе с составным объектом Address в XML.

Наш окончательный XML будет выглядеть примерно так:

 Person>   firstName>RohanfirstName>   lastName>DayelastName>   phoneNumbers>   phoneNumbers>9911034731phoneNumbers>   phoneNumbers>9911033478phoneNumbers>   phoneNumbers>   address>   streetName>Name1streetName>   city>City1city>   address>   address>   streetName>Name2streetName>   city>City2city>   address>   Person> 

Обратите внимание, что наши телефонные номера инкапсулированы в оболочку phoneNumbers , а наш адрес — нет.

Мы можем выразить этот нюанс через аннотацию @JacksonXMLElementWrapper в нашем классе Person :

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

На самом деле мы можем изменить имя элемента упаковки с помощью @JacksonXmlElementWrapper(localName = ‘phoneNumbers’). Или, если мы не хотим оборачивать наши элементы, мы можем отключить сопоставление с помощью @JacksonXmlElementWrapper(useWrapping = false) .

Затем мы определим наш тип адреса :

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

Джексон позаботится об остальном за нас. Как и раньше, мы можем просто снова вызвать 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 в список

Джексон также может читать 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 и получить POJO из базовых XML-данных.

Мы также изучили, как сериализовать и десериализовать сложные компоненты, содержащие коллекции.

Исходный код, сопровождающий эту статью, доступен на GitHub .

Источник

Читайте также:  Java методы массив return
Оцените статью