Deserialization – How to Convert XML to Java Objects Using Jackson API

When working with data interchange formats like XML, it's often necessary to convert the structured data into Java objects for further processing. This process is called deserialization. The Jackson library, well-known for its JSON processing capabilities, also supports XML data handling through the Jackson Dataformat XML module.

In this blog post, we’ll explore how to use the Jackson API to deserialize XML into Java objects with a step-by-step guide.


1. What is Deserialization?

Deserialization is the process of converting structured data, such as XML or JSON, into corresponding Java objects. For example, converting the following XML:

<employee>

    <id>101</id>

    <name>John Doe</name>

    <department>Engineering</department>

</employee>

...into a Java object like:

public class Employee {
    private int id;
    private String name;
    private String department;

    // Getters and Setters
}

2. Why Use Jackson for XML Processing?

Jackson provides a unified approach for serializing and deserializing both JSON and XML. With the Jackson Dataformat XML module, you can work with XML data seamlessly alongside Jackson's core features.

Key advantages include:

  • Simplicity in converting XML to POJOs.
  • Annotations for fine-grained control over mappings.
  • Compatibility with existing JSON mappings.

3. Adding Jackson XML Dependency

To get started, add the following dependencies to your pom.xml (for Maven users):

<dependency>

    <groupId>com.fasterxml.jackson.dataformat</groupId>

    <artifactId>jackson-dataformat-xml</artifactId>

    <version>2.15.2</version>

</dependency>

4. Example: Deserializing XML to Java Objects

Step 1: Create the POJO

Define a simple POJO (Plain Old Java Object) that matches the structure of the XML.

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;


public class Employee {

    @JacksonXmlProperty(localName = "id")

    private int id;


    @JacksonXmlProperty(localName = "name")

    private String name;


    @JacksonXmlProperty(localName = "department")

    private String department;


    // Getters and Setters

    public int getId() {

        return id;

    }


    public void setId(int id) {

        this.id = id;

    }


    public String getName() {

        return name;

    }


    public void setName(String name) {

        this.name = name;

    }


    public String getDepartment() {

        return department;

    }


    public void setDepartment(String department) {

        this.department = department;

    }

}

Step 2: Prepare the XML Data

Create an XML string or file to use as input.

<employee>

    <id>101</id>

    <name>John Doe</name>

    <department>Engineering</department>

</employee>

Step 3: Deserialize the XML

Use Jackson's XmlMapper class to map the XML data to the Java object.

import com.fasterxml.jackson.dataformat.xml.XmlMapper;


public class XmlToJavaExample {

    public static void main(String[] args) {

        try {

            // Create XmlMapper instance

            XmlMapper xmlMapper = new XmlMapper();


            // XML input as a String

            String xml = """

                    <employee>

                        <id>101</id>

                        <name>John Doe</name>

                        <department>Engineering</department>

                    </employee>

                    """;


            // Deserialize XML to Java Object

            Employee employee = xmlMapper.readValue(xml, Employee.class);


            // Print the Java object

            System.out.println("ID: " + employee.getId());

            System.out.println("Name: " + employee.getName());

            System.out.println("Department: " + employee.getDepartment());

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

Output:

ID: 101
Name: John Doe
Department: Engineering

5. Additional Features

Annotations for Customization

  • @JacksonXmlProperty: Customizes the XML element mapping.
  • @JacksonXmlElementWrapper: Handles collections or lists in XML.

Example for a list of employees:

<employees>

    <employee>

        <id>101</id>

        <name>John Doe</name>

        <department>Engineering</department>

    </employee>

    <employee>

        <id>102</id>

        <name>Jane Smith</name>

        <department>HR</department>

    </employee>

</employees>

With annotations:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;

public class Employees {
    @JacksonXmlElementWrapper(localName = "employees", useWrapping = true)
    private List<Employee> employeeList;

    // Getters and Setters
}

6. Error Handling

Always include robust error handling when working with deserialization. Use exceptions like JsonProcessingException to catch errors such as malformed XML or mismatched mappings.

Followers