0 0

JAXB 如何序列化List<Map<String, String>>5

bean结构简单如下
public class User {
	private int count;
	private List<Map<String, String>> rows;
        
}

getter、setter省略
如何才能序列化成下面的格式
<user>
	<count></count>
	<rows>
		<row>
			<id></id>
			<name></name>
		</row>
		<row>
			<id></id>
			<name></name>
		</row>
	</rows>
<user>

其中id、name为Map中的Key。
望各位不吝赐教,谢谢
2013年9月29日 15:10

1个答案 按时间排序 按投票排序

0 0

采纳的答案

import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {

	/**
	 * 
	 *JAXB XML适配器
	 *
	 */
	public static class UserRowsXmlAdapter extends
			XmlAdapter<Object, List<Map<String, String>>> {

		/**
		 * 把 JAVA转化成ELEMENT对象
		 */
		@Override
		public Object marshal(List<Map<String, String>> rows) throws Exception {

			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document document = db.newDocument();
			Element rootElement = document.createElement("myrows");// 这里名字随便,以外面为准,JAXB会自动替换名字的
			document.appendChild(rootElement);

			for (Map<String, String> row : rows) {

				Element rowEle = document.createElement("row");

				Element idEle = document.createElement("id");
				Element nameEle = document.createElement("name");

				Entry<String, String> entry = row.entrySet().iterator().next();// 第一个ENTRY
				String id = entry.getKey();// ID
				String name = entry.getValue();// NAME

				idEle.setTextContent(id);
				nameEle.setTextContent(name);
				rowEle.appendChild(idEle);
				rowEle.appendChild(nameEle);
				rootElement.appendChild(rowEle);
			}
			return rootElement;
		}

		/**
		 * 把XML ELEMENT转化成JAVA对象
		 */
		@Override
		public List<Map<String, String>> unmarshal(Object rowsElement)
				throws Exception {

			if (rowsElement == null) {
				return null;
			}

			Element rowsEle = (Element) rowsElement;

			NodeList rowNodes = rowsEle.getChildNodes();
			int rowCount = (rowNodes == null ? 0 : rowNodes.getLength());
			if (rowCount == 0) {
				return null;
			}
			List<Map<String, String>> result = new ArrayList<Map<String, String>>(
					rowCount);

			for (int i = 0; i < rowCount; i++) {
				Node rowNode = rowNodes.item(i);
				if (!"row".equals(rowNode.getNodeName())) {
					System.out.println("发现非法节点:" + rowNode.getNodeName()
							+ "忽略.");
					continue;
				}
				NodeList idNameNodes = rowNode.getChildNodes();
				int nodeSize = (idNameNodes == null ? 0 : idNameNodes
						.getLength());
				if (nodeSize == 0) {
					continue;
				}
				Map<String, String> row = new HashMap<String, String>();
				String id = null;
				String name = null;
				for (int j = 0; j < nodeSize; j++) {
					Node node = idNameNodes.item(j);
					String nodeName = node.getNodeName();
					String nodeValue = node.getTextContent();
					if ("id".equals(nodeName)) {
						id = nodeValue;
					} else if ("name".equals(nodeName)) {
						name = nodeValue;
					}
					if (id != null && name != null) {
						break;
					}
				}

				if (id != null) {
					row.put(id, name);
				} else {
					System.out.println("未在row节点里发现id节点,忽略.");
				}
				result.add(row);
			}

			return result;
		}

	}
	
	@XmlElement(name="count")
	private int count;
	@XmlElement(name="rows")
	@XmlJavaTypeAdapter(UserRowsXmlAdapter.class)
	private List<Map<String, String>> rows;

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

	public List<Map<String, String>> getRows() {
		return rows;
	}

	public void setRows(List<Map<String, String>> rows) {
		this.rows = rows;
	}

	@Override
	public String toString() {
		return "User [count=" + count + ", rows=" + rows + "]";
	}

	public static void main(String[] args) throws JAXBException {
		User u = new User();
		List<Map<String, String>> rows = new ArrayList<Map<String, String>>(2);
		Map<String, String> row = new HashMap<String, String>();
		row.put("1", "土豆");// userid=1,username=土豆
		rows.add(row);
		row = new HashMap<String, String>();
		row.put("2", "洋葱");// userid=2,username=洋葱
		rows.add(row);
		u.setCount(rows.size());
		u.setRows(rows);

		JAXBContext jc = JAXBContext.newInstance(User.class);
		StringWriter writer = new StringWriter();
		jc.createMarshaller().marshal(u, writer);
		System.out.println("Marshalled xml==>");
		System.out.println(writer);
		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
				+ "<user><count>2</count><rows><row><id>1</id><name>土豆</name>"
				+ "</row><row><id>2</id><name>洋葱</name>"
				+ "</row></rows></user>";

		User newu = (User) jc.createUnmarshaller().unmarshal(
				new StringReader(xml));
		System.out.println("UnMarshalled user==>");
		System.out.println(newu);
	}

}



输出结果:


Marshalled xml==>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><count>2</count><rows><row><id>1</id><name>土豆</name></row><row><id>2</id><name>洋葱</name></row></rows></user>

UnMarshalled user==>

User [count=2, rows=[{1=土豆}, {2=洋葱}]]

2013年9月29日 20:40

相关推荐

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

    Map&lt;String, String&gt; result = new HashMap&lt;&gt;(); NodeList nodeList = root.getChildNodes(); for (int i = 0; i &lt; nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == ...

    spring,cxf,restful发布webservice传递List,Map,List&lt;Map&gt;

    当我们需要在Web服务中传递复杂对象,如List、Map或List&lt;Map&gt;时,可以使用Java的序列化机制。在CXF中,可以通过JAXB(Java Architecture for XML Binding)将Java对象转换为XML格式,以便在网络间传输。例如,如果你...

    java list和xml互转例子

    List&lt;Map&lt;String, Object&gt;&gt; dataList = new ArrayList&lt;&gt;(); for (Element dataElement : rootElement.elements("data")) { Map&lt;String, Object&gt; dataMap = new HashMap&lt;&gt;(); for (Element element : data...

    17.4 webservice map参数详解1

    public void processMap(@WebParam(name = "mapData") @XmlJavaTypeAdapter(MapAdapter.class) Map&lt;String, Object&gt; map) { // ...处理Map的逻辑... } ``` 6. **客户端测试** - 描述中提到客户端使用反射来构造`...

    java利用JAXB实现对象和xml互相转换方法与实例详解

    public class MapAdapter extends XmlAdapter&lt;AdaptedMap, Map&gt; { @Overridepublic AdaptedMap marshal(Map map) throws Exception { if (map == null) { return null; } AdaptedMap adaptedMap = new AdaptedMap();...

    用java语言实现学生成绩管理

    private Map&lt;String, Double&gt; grades; // 成绩以科目为键,分数为值 // 构造函数、getters和setters } ``` 接着,我们可以创建一个成绩管理类(GradeManager)来处理学生的成绩信息。这个类可以包含如下方法: ...

    json-lib方式的包

    Map&lt;String, String&gt; map = new HashMap&lt;&gt;(); map.put("key1", "value1"); map.put("key2", "value2"); String jsonString = JSONObject.fromObject(map).toString(); // 反序列化:将JSON字符串转换为Java对象 ...

    java转换xml、list、map和json.pdf

    - `doc2String()`方法(未在代码中显示)应该是将`Document`对象转换为字符串的方法,通常会使用`OutputFormat`和`XMLWriter`来格式化输出的XML字符串。 3. **XML到List转换**: - `listtoXml()`方法类似地将List...

    任意XML转实体类 实体类 转XML 方法 JAVA

    例如,如果`&lt;person&gt;`节点下有多个`&lt;address&gt;`子节点,我们可以定义一个`List&lt;Address&gt; addressList`字段来存储。在解析时,遍历`&lt;address&gt;`节点,创建对应的`Address`对象并添加到列表中。 另一方面,从实体类转...

    fastjson实用工具类

    - `parseArray(String jsonString, Class&lt;T&gt; clazz)`: 解析JSON数组字符串,并转换为指定类型的List集合。 - `toJavaList(JSONArray jsonArray, Class&lt;T&gt; clazz)`: 将JSONArray转换为指定类型的List。 3. ...

    Java xml 转 map

    public void xmlToMap(Element element, Map&lt;String, Object&gt; map) { // 遍历属性 NamedNodeMap attributes = element.getAttributes(); for (int i = 0; i &lt; attributes.getLength(); i++) { Node attr = ...

    java操作XML实例代码

    public void addChild(String parentNodeName, String newNodeName, String childNodeName, String text, Map&lt;String, String&gt; attributesMap) { Element parent = document.getRootElement().element...

    restful WebService的入门例子.pdf

    private static Map&lt;String, Room&gt; rooms; // Initialize the HashMap with some sample data public static void addRoom(Room room) { rooms.put(room.getId(), room); } // ... deleteRoom, updateRoom, ...

    jibx 开发指南 Jibx完成Java到XML的相互转换

    与JAXB等其他框架相比,Jibx允许更精细的控制序列化和反序列化过程,比如可以通过XML绑定文件自定义序列化行为。然而,这也意味着使用Jibx需要更多的配置工作,例如生成绑定文件和对应的jar文件。 总结一下,Jibx是...

    CXF入门.rar

    Apache CXF入门范例以及对传递ListMap类型的疑惑】中,可能会详细解释如何创建和调用一个使用CXF的Web服务,同时也可能讨论了在处理复杂数据类型如List&lt;Map&lt;String, Object&gt;&gt;时遇到的问题和解决方案。通常,CXF允许...

    google-gson-2.2.2

    开发者可以通过实现`JsonSerializer&lt;T&gt;`和`JsonDeserializer&lt;T&gt;`接口来自定义序列化和反序列化的逻辑。 5. **序列化策略**:Gson提供了多种序列化策略,如忽略null字段、控制字段可见性等,以满足不同的需求。这些...

    java 通过模板生成 xml

    Map&lt;String, Object&gt; data = new HashMap&lt;&gt;(); data.put("items", Arrays.asList(new Item("Sample Name"))); // 输出XML StringWriter writer = new StringWriter(); template.process(data, writer); FileUtils....

    jason_plans:适用于JavaOne 2015的JSON-B演示项目

    项目中可能会有处理泛型类型的示例,例如`List&lt;T&gt;`或`Map&lt;String, T&gt;`。 7. **自定义序列化和反序列化逻辑**:通过实现`JsonbAdapter`接口,开发者可以定义自定义的序列化和反序列化逻辑,以处理特定的Java类型或...

    JAVA API1.6中文文档.CHM

    8. **泛型**:自Java 5引入,泛型增强了类型安全,减少了类型转换的必要性,如`List&lt;String&gt;`。 9. **枚举**:Java 5引入的新特性,允许创建不可变的、有限的常量集合,提供了比常量更强大的功能。 10. **注解...

Global site tag (gtag.js) - Google Analytics