# JAXB – Java 中的 Marshal 和 Unmarshal 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
com.sun.xml.bind
jaxb-core
2.2.8-b01
com.sun.xml.bind
jaxb-impl
2.2-promoted-b65
```
## 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 employeeMap = new HashMap();
public Map getEmployeeMap() {
return employeeMap;
}
public void setEmployeeMap(Map employeeMap) {
this.employeeMap = employeeMap;
}
}
```
## 3)元帅映射到 XML 示例
编组或**的 Java 示例将 Java 映射转换为 xml** 表示形式。 在下面的示例代码中,我首先在控制台中编写员工地图,然后在文件中编写。
```java
public static void main(String[] args) throws JAXBException
{
HashMap map = new HashMap();
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:
1
1
Lokesh
Gupta
100.0
2
2
John
Mclane
200.0
```
## 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)源代码下载
要下载以上示例的源代码,请点击以下链接。
[Download Sourcecode](https://docs.google.com/file/d/0B7yo2HclmjI4TDNDR2phTVJLbkk/edit?usp=sharing "download jaxb map marshaling example source code")
学习愉快!