JAXB: Marshal / Unmarshal a Map in Java

We know that JAXB(Java Architecture for XML Binding) allows Java developers to map Java classes to XML representations. JAXB provides two main features: the ability to marshal Java objects into XML and the inverse, i.e. to unmarshal XML back into Java objects. JAXB mostly is used while implementing …

We know that JAXB(Java Architecture for XML Binding) allows Java developers to map Java classes to XML representations. JAXB provides two main features: the ability to marshal Java objects into XML and the inverse, i.e. to unmarshal XML back into Java objects. JAXB mostly is used while implementing webservices or any other such client interface for an application where data needs to be transferred in XML format instead of HTML format which is the default in the case of the visual clients like web browsers.

A good example is Facebook APIs. Facebook has exposed its services through some open endpoints in the form of RESTful webservices where you hit a URL and post some parameters, and the API returns the data in xml format. Now it is upto you, how you use that data.

In this post, I am giving an example of marshalling and unmarshalling of Map object e.g. HashMap. These map objects usually represent the mapping between some simple keys to complex data.

1. Maven

Start with adding the latest ‘jakarta‘ dependencies for adding the JAXB support (Java 11 onwards).

<dependencies>
  <dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>4.0.0</version>
  </dependency>
</dependencies>

<dependencies>
  <dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>4.0.3</version>
    <scope>runtime</scope>
  </dependency>
</dependencies>

2. Model

I have created a model class “Employee.java” which has some common fields. I want to build code that could parse maps of objects where key is sequence code and value is Employee object itself.

@XmlRootElement(name = "employee")
@XmlAccessorType (XmlAccessType.FIELD)
public class Employee 
{
  private Integer id;
  private String firstName;
  private String lastName;
  private double income;
   
  //Getters and Setters
}
@XmlRootElement (name="employees")
@XmlAccessorType(XmlAccessType.FIELD)
public class EmployeeMap {
   
  private Map<Integer, Employee> employeeMap = new HashMap<Integer, Employee>();
 
  public Map<Integer, Employee> getEmployeeMap() {
    return employeeMap;
  }
 
  public void setEmployeeMap(Map<Integer, Employee> employeeMap) {
    this.employeeMap = employeeMap;
  }
}

3. Marshal Map to XML Example

Java example to marshal or convert java map to xml representation. In below example code, I am writing the map of employees first in console, and then in a file.

public static void main(String[] args) throws JAXBException 
{
  HashMap<Integer, Employee> map = new HashMap<Integer, Employee>();
   
  Employee emp1 = new Employee();
  emp1.setId(1);
  emp1.setFirstName("Lokesh");
  emp1.setLastName("Gupta");
  emp1.setIncome(100.0);
   
  Employee emp2 = new Employee();
  emp2.setId(2);
  emp2.setFirstName("John");
  emp2.setLastName("Mclane");
  emp2.setIncome(200.0);
   
  map.put( 1 , emp1);
  map.put( 2 , emp2);
   
  //Add employees in map
  EmployeeMap employeeMap = new EmployeeMap();
  employeeMap.setEmployeeMap(map);
   
  /******************** Marshalling example *****************************/
   
  JAXBContext jaxbContext = JAXBContext.newInstance(EmployeeMap.class);
  Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
 
  jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
 
  jaxbMarshaller.marshal(employeeMap, System.out);
  jaxbMarshaller.marshal(employeeMap, new File("c:/temp/employees.xml"));
}

The program output:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employees>
    <employeeMap>
        <entry>
            <key>1</key>
            <value>
                <id>1</id>
                <firstName>Lokesh</firstName>
                <lastName>Gupta</lastName>
                <income>100.0</income>
            </value>
        </entry>
        <entry>
            <key>2</key>
            <value>
                <id>2</id>
                <firstName>John</firstName>
                <lastName>Mclane</lastName>
                <income>200.0</income>
            </value>
        </entry>
    </employeeMap>
</employees>

4. Unmarshal XML to Map Example

Java example to convert xml to Java map object. Let’s see the example of our EmployeeMap class.

JAXBContext jaxbContext = JAXBContext.newInstance(EmployeeMap.class);
  Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
  EmployeeMap empMap = (EmployeeMap) jaxbUnmarshaller.unmarshal( new File("c:/temp/employees.xml") );
   
  for(Integer empId : empMap.getEmployeeMap().keySet())
  {
    System.out.println(empMap.getEmployeeMap().get(empId).getFirstName());
    System.out.println(empMap.getEmployeeMap().get(empId).getLastName());
  }

The program output:

Lokesh
Gupta
John
Mclane

Happy Learning !!

Source Code on Github

Leave a Comment

  1. i want learn Data Structures and Algorithms and I want know which algorithm is better for which Data Structures also….. please give me Best Reference to learn Time Complexity and Space Complexity also…..

    Reply
      • Ok But as per your point of view you can prefer one book, so Just give me any one based on your experience level to refer, it could be Commercial also fine or Open Source also fine…

        I want grow up my Skills, i am trying for 6 months but i did’t find So please help me ……

        Reply
  2. Hi Lokesh good evening ,

    thank you for Sharing Content here and giving reply for to US.
    i got one Business case, that I have to Develop one Web Service and That Web Service Will have to as SOAP(JAX-RS) Web Service and as well as REST full web Service, to get the Solution i am referring JAX-RS Spec and SOAP(JAX-RS) Spec, But i could n’t able to find the Solution . So can you help me Here.

    Thanking you.

    Reply
  3. Hi,

    This is a very good article which helped through the issue I have been struggling with a few days now.

    How can I get rid of the unwanted tags , 1 and from the output xml and only retain the actual Employee related Tags.

    Thanks,
    Ganga

    Reply
  4. I have one ParentItem.java class having common attributes and 2 child classes Merchandise.java and Offer.java. I have one Transaction.java class having list of ParentItem, so as to marshal list of 2 different object and want to get structure like this :

    LINE_ITEM
    ADD
    1
    REG2
    7.00
    7.42
    0.42

    5.00
    #1 Combo Meal
    1695155651
    5.00
    1

    5.00
    #1 Combo Meal
    1695155652
    5.00
    1

    OTHER_COUPON
    1695155653
    EmpDisc
    2.00
    1695155651

    MERCHANT_COUPON
    1695155654
    1OffAnyPurch
    1.00
    1695155651

    but doing all my stuff of coding I am getting following structure:

    ADD
    LINE_ITEM

    TIE WAIST SHIRT DRESS
    1

    Offer
    100

    Reply
  5. Ankush

    I want output is like that as PFB

    Employees e =
    e.getFirstName() = “Ankush”
    e.getAddress() = “>”

    how can get this result from jaxb

    Reply
  6. Hi Lokesh,

    Could you please help me with the below XML structure where the below block would be repeated many times depending upon the condition.

    ABC

    .

    Many Thanks!

    Reply

Leave a Comment

About Us

HowToDoInJava provides tutorials and how-to guides on Java and related technologies.

It also shares the best practices, algorithms & solutions and frequently asked interview questions.