JAXB投射HashMap
JAXB映射HashMap
JAXB是很强大的XML <—> Java Class映射工具。很可惜它默认不支持对Hashmap的映射。但我们可以通过使用XmlJavaTypeAdapter来扩展实现,本文介绍详细方法。
首先创建一个带有HashMap的Class
我们使用自己的 MyHashMapAdapter.class 来映射 HashMap :
里面使用了自定义的 MyHashMapType :
使用 MyHashEntryType 来实现对 HashMap 每一条数据的映射:
下面做一个 Demo 来使用一下我们的 Adapter :
代码运行结果如下:
原文链接:http://www.bluedash.net/spaces/%E4%BD%BF%E7%94%A8JAXB%E6%98%A0%E5%B0%84HashMap
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