`

JAXB映射HashMap

    博客分类:
  • XML
 
阅读更多
JAXB是很强大的XML <—> Java Class映射工具。很可惜它默认不支持对Hashmap的映射。但我们可以通过使用XmlJavaTypeAdapter来扩展实现,本文介绍详细方法。
首先创建一个带有HashMap的Class
package org.bluedash.demo;

import java.util.HashMap;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

	@XmlJavaTypeAdapter(MyHashMapAdapter.class)
	HashMap hashmap;

	public Foo() {
		hashmap = new HashMap();
	}

	public HashMap getHashmap() {
		return hashmap;
	}

	public void setHashmap(HashMap hashmap) {
		this.hashmap = hashmap;
	}

}

我们使用自己的 MyHashMapAdapter.class 来映射 HashMap :
package org.bluedash.demo;

import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public final class MyHashMapAdapter extends XmlAdapter<MyHashMapType, HashMap> {

	@Override
	public MyHashMapType marshal(HashMap arg0) throws Exception {
		MyHashMapType myHashMapType = new MyHashMapType();
		for (Entry entry : (Set<Entry>) arg0.entrySet()) {
			MyHashEntryType myHashEntryType = new MyHashEntryType();
			myHashEntryType.key = (Integer) entry.getKey();
			myHashEntryType.value = (String) entry.getValue();
			myHashMapType.entries.add(myHashEntryType);
			// myHashMapType = myHashEntryType;
		}
		return myHashMapType;
	}

	@Override
	public HashMap unmarshal(MyHashMapType arg0) throws Exception {
		HashMap hashMap = new HashMap();
		for (MyHashEntryType myHashEntryType : (List<MyHashEntryType>) arg0.entries) {
			hashMap.put(myHashEntryType.key, myHashEntryType.value);
		}
		return hashMap;
	}

}

里面使用了自定义的 MyHashMapType :
package org.bluedash.demo;

import java.util.ArrayList;
import java.util.List;

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

@XmlRootElement
public class MyHashMapType {

    @XmlElement(required = true)
	public List<MyHashEntryType> entries = new ArrayList<MyHashEntryType>();
}

使用 MyHashEntryType 来实现对 HashMap 每一条数据的映射:
package org.bluedash.demo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public class MyHashEntryType {

	@XmlAttribute
	public Integer key;

	@XmlValue
	public String value;

}

下面做一个 Demo 来使用一下我们的 Adapter :
package org.bluedash.demo;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

	public static void main(String[] args) throws JAXBException {
		JAXBContext jaxbContext = JAXBContext.newInstance(Foo.class);

		Foo foo = new Foo();
		foo.getHashmap().put(1, "One");
		foo.getHashmap().put(2, "Two");
		foo.getHashmap().put(3, "Three");

		Marshaller marshaller = jaxbContext.createMarshaller();
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

		// Output the generated XML:
		marshaller.marshal(foo, System.out);

		// Save the output to a foo.xml
		File xmlFile = new File("foo.xml");
		marshaller.marshal(foo, xmlFile);

		// Restore the Foo class from xml file
		Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
		Foo createdFoo = (Foo) unmarshaller.unmarshal(xmlFile);

		// See the result
		System.out.println(createdFoo.hashmap);
	}
}

代码运行结果如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
    <hashmap>
        <entries key="1">One</entries>
        <entries key="2">Two</entries>
        <entries key="3">Three</entries>
    </hashmap>
</foo>
{1=One, 2=Two, 3=Three}

原文链接:http://www.bluedash.net/spaces/%E4%BD%BF%E7%94%A8JAXB%E6%98%A0%E5%B0%84HashMap
分享到:
评论

相关推荐

    jaxb xml 转map

    当我们有一个XML文档,我们可以创建对应的Java类,这些类将作为映射的基础。然后,JAXB会使用这些类来解析XML并生成相应的对象实例。对于简单的XML,这通常很有效。但是,对于复杂的XML结构,转换为Map可能更为合适...

    java课程详细讲解(针对初学者)

    - **散列映射HashMap和树映射TreeMap**:提供键值对存储,HashMap以非排序的方式快速查找,TreeMap则保持键的排序。 5. **多线程** - **线程创建**:通过实现Runnable接口或继承Thread类来创建线程。 - **同步...

    java试题 java笔试题 java面试题

    JDK 1.6 中引入了多个新特性,包括 desktop 类和 systemtray 类、使用 JAXB2 实现对象与 xml 之间映射、理解 STAX、使用 compiler API 等。 七、Hibernate 工作机制 Hibernate 的工作机制可以分为八个步骤:读取并...

    java 通过模板生成 xml

    2. **JAXB**:JAXB允许将Java对象直接映射到XML,反之亦然。对于复杂的XML结构和大量的数据,JAXB可能更为高效。使用模板时,可以创建一个XML模板类,然后根据需要实例化并转换为XML。 ```java import javax.xml....

    json数据转换jar包

    3. **Jackson类型转换**:`jackson-module-jaxb-annotations`允许使用JAXB注解进行数据绑定,如果你的项目已经使用了JAXB,这个模块可以无缝集成。 4. **其他模块**:Jackson还有许多其他模块,如`jackson-data...

    json-lib方式的包

    这个库在Java社区中特别受欢迎,因为它提供了多种Java对象到JSON的映射方式,包括使用Hibernate、EJB3、JaxB等技术的对象。此外,json-lib还支持XML到JSON和JSON到XML的转换,增强了数据交换的灵活性。 json-lib的...

    map/list集合转化成xml字符串 xml字符串转化成map/list集合

    以`JAXB`为例,它提供了一种方便的方式来映射Java对象到XML以及反之。首先,你需要创建一个`JAXBContext`实例,然后使用`Marshaller`对象将`Map`对象写入XML字符串。 ```java import javax.xml.bind.JAXBContext; ...

    各种转换,xml,实体bean,动态bean,map等

    在Java中,我们可以使用JAXB(Java Architecture for XML Binding)进行XML与Java对象之间的双向绑定,或者使用DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等API来...

    Java&XML应用

    4. **JAXB(Java Architecture for XML Binding)**:JAXB是Java标准,用于在Java对象和XML之间进行自动转换,简化了XML的处理。通过注解,可以将Java类映射到XML元素,反之亦然。 5. **JAXP(Java API for XML ...

    通过实例学习JAVA对象转成XML输出

    在实际应用中,如果需要自定义XML的输出格式,可以通过添加更多的JAXB注解,比如`@XmlElement`、`@XmlAttribute`等来控制每个字段如何映射到XML元素或属性。 总结来说,将Java对象转换为XML输出是通过使用JAXB框架...

    [Java参考文档].JDK-API-1-6-zh-CN.CHM.zip

    JAXB(Java Architecture for XML Binding)则用于XML和Java对象之间的映射。 这个CHM文件不仅包含上述内容,还包含了异常处理、国际化、日期和时间、安全、垃圾收集等更多Java核心特性的详细解释。开发者可以通过...

    java 无难事

    在实际开发中,我们还经常会遇到各种框架,如Spring用于依赖注入和企业级应用开发,Hibernate用于对象关系映射,Struts或Spring MVC用于构建Web应用,JUnit用于单元测试等。这些框架的源码分析有助于我们了解软件...

    JAVA中文API

    12. **XML处理**:Java API包含了处理XML的类库,如DOM、SAX、StAX解析器,以及JAXB用于对象和XML之间的映射。 13. **Java时间日期API**:Java 8引入了全新的日期时间API,包括LocalDate、LocalTime、LocalDateTime...

    JAVA高级编程中Enum枚举

    `EnumMap`则是一种以枚举为键的映射表,性能优于普通`HashMap`。 总之,深入理解并熟练运用Java的`Enum`枚举可以提升代码的可读性、安全性和效率。通过学习提供的资源,开发者将能更好地掌握枚举在各种场景下的应用...

    java实现的20个系统案例源码集合+MySQL数据库文件

    3. **ORM框架**:Hibernate或MyBatis等对象关系映射(ORM)框架可能被用于简化数据库操作,将Java对象直接映射到数据库表,提高开发效率。 4. **Servlet与JSP**:作为Web应用的基础,Servlet处理HTTP请求,JSP用于...

    JDK_API_1_6_zh_CN.rar

    XML处理方面,Java API提供了DOM、SAX和StAX三种解析器,以及JAXB用于对象与XML之间的映射,支持XML的生成和解析。 除此之外,Java API 1.6还包含了国际化、事件模型、Swing组件库、JavaBeans组件模型、Applet和...

    JAVA核心技术第12版(卷一+卷二)

    5. **XML处理**:讲解DOM和SAX解析XML,以及使用JAXB进行对象到XML的映射。 6. **Java的模块系统**:介绍Java 9引入的模块化系统,以及如何构建和打包模块化应用。 7. **Java EE基础**:概述Servlet、JSP、EJB等...

    Java根据XML数据绘制天气图(类似墨迹天气).zip

    Java通过JAXB(Java Architecture for XML Binding)或DOM(文档对象模型)等API来解析XML文件,提取所需的数据。 接下来,我们探讨Java绘图库。在Java中,可以使用JavaFX、Swing或AWT等图形用户界面(GUI)库来...

    Java常用工具类集合

    此外,`HashMap`和`TreeMap`等映射类提供了键值对的数据存储和检索。 2. **日期时间处理**:`java.time`包是Java 8引入的新特性,包含了`LocalDate`,`LocalTime`和`LocalDateTime`等类,用于处理日期和时间。`java...

Global site tag (gtag.js) - Google Analytics