# JAXB – 在 Java 中编组和解组`HashMap`

> 原文： [https://howtodoinjava.com/jaxb/jaxb-example-marshalling-and-unmarshalling-hashmap-in-java/](https://howtodoinjava.com/jaxb/jaxb-example-marshalling-and-unmarshalling-hashmap-in-java/)

我们知道 [JAXB（用于 XML 绑定的 Java 架构）](https://en.wikipedia.org/wiki/Java_Architecture_for_XML_Binding "jaxb")允许 Java 开发人员将 Java 类映射到 XML 表示形式。 JAXB 提供了两个主要功能：将 Java 对象编组为 XML 的能力和相反的功能，即将 XML 解组为 Java 对象的能力。 JAXB 主要用于实现 Web 服务或任何其他此类客户端接口的应用，在该应用中，数据需要以 XML 格式（而不是 HTML 格式）传输，而对于可视客户端（如 Web 浏览器）来说，HTML 格式是默认格式。

一个很好的例子是 facebook API。 Facebook 已通过 [RESTful Web 服务](//howtodoinjava.com/restful-web-service/ "resteasy tutorials")的形式通过一些开放的端点公开了其服务，您在其中单击 URL 并发布了一些参数，而 API 以 xml 格式返回数据。 现在由您决定如何使用这些数据。

在本文中，我将举一个**编组和解组`Map`对象**的示例，例如 [`HashMap`](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java") 。 这些映射对象通常表示一些简单键与复杂数据之间的映射。

## 1）JAXB Maven 依赖关系

要运行 JAXB 示例，我们需要添加运行时依赖项，如下所示。

```java
<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）映射模型类

我创建了一个模型类“`Employee.java`”，它具有一些公共字段。 我想构建可以解析对象映射的代码，其中键是序列码，值是`Employee`对象本身。

```java
@XmlRootElement(name = "employee")
@XmlAccessorType (XmlAccessType.FIELD)
public class Employee 
{
	private Integer id;
	private String firstName;
	private String lastName;
	private double income;

	//Getters and Setters
}

```

```java
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）编组映射到 XML 示例

**将 Java 映射编组或转换为 xml** 表示形式的 Java 示例。 在下面的示例代码中，我首先在控制台中编写员工映射，然后在文件中编写。

```java
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）解组 XML 到映射示例

Java 示例**将 xml 转换为 Java 映射**对象。 让我们看一下`EmployeeMap`类的示例。

```java
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）源代码下载

要下载以上示例的源代码，请点击以下链接。

[下载源码](https://docs.google.com/file/d/0B7yo2HclmjI4TDNDR2phTVJLbkk/edit?usp=sharing "download jaxb map marshaling example source code")

学习愉快！