38.md 5.5 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4
# 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/)

W
wizardforcel 已提交
5
我们知道 [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 格式是默认格式。
W
wizardforcel 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173

一个很好的例子是 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 示例将 Java 映射转换为 xml** 表示形式。 在下面的示例代码中,我首先在控制台中编写员工地图,然后在文件中编写。

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

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

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

学习愉快!