JAXB – Marshal and Unmarshal HashMap 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 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 default in case of visual client like web browsers.

A good example is facebook APIs. Facebook has exposed its services through some open endpoints in form of RESTful webservices where you hit a URL and post some parameters, and API return you 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 are usually represent the mapping between some simple keys to complex data.

1) JAXB Maven Dependencies

To run JAXB examples, we need to add run time dependencies like below.

<dependency>
	<groupId>com.sun.xml.bind</groupId>
	<artifactId>jaxb-core</artifactId>
	<version>2.2.8-b01</version>
</dependency>
<dependency>
	<groupId>com.sun.xml.bind</groupId>
	<artifactId>jaxb-impl</artifactId>
	<version>2.2-promoted-b65</version>
</dependency>

2) Map model classes

I have created a model class “Employee.java” which has some common fields. I want to build code which could parse map 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
}
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@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"));
}

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.

private static void unMarshalingExample() throws JAXBException 
{
	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());
	}
}
	
Output:

Lokesh
Gupta
John
Mclane

5) Sourcecode Download

To download the sourcecode of above example follow below link.

Happy Learning !!

Comments

Subscribe
Notify of
guest

28 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments

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.