前言:

JAXB(Java Architecture for XML Binding) 用于 XML 绑定的 Java 体系结构(JAXB)是允许 Java 开发人员将 Java 类映射到 XML 表示形式的软件框架。 JAXB 支持将 Java 对象编组为 XML,然后将 XML 解组为 Java 对象。
如下:

package com.c.utils.jaxb;import com.c.utils.LoggerUtils;import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;/*** @author zhy*/
public class JAXbUtils {private JAXbUtils() {}public static <T> void save(T obj, File file) {try {JAXBContext jc = JAXBContext.newInstance(obj.getClass());Marshaller jaxbMarshaller = jc.createMarshaller();jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);jaxbMarshaller.marshal(obj, file);// jaxbMarshaller.marshal(obj, System.out);} catch (JAXBException e) {LoggerUtils.getLogger(JAXbUtils.class).error(e.getMessage(), e);}}public static <T> T load(File file, Class<? extends T> type) {try {JAXBContext jc = JAXBContext.newInstance(type);Unmarshaller unmarshaller = jc.createUnmarshaller();return (T) unmarshaller.unmarshal(file);} catch (JAXBException e) {e.printStackTrace();}return null;}}

JAXB 与 Map<String,String>

JAXB 默认转换 map 的结果

JABX 默认将 Map<String,String> 序列化成:

<item><key>xxx<key><value>xxx<value>
</item>

如下:

package com.c.utils.jaxb;import org.junit.Assert;
import org.junit.Test;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.File;
import java.util.HashMap;
import java.util.Map;public class JAXbUtilsTest {@Testpublic void saveMap() {Config config = new Config();config.map = new HashMap<>();String naturalSelection = "自然选择号";String blueSpace = "蓝色空间号";config.map.put(naturalSelection, "东方延绪");config.map.put(blueSpace, "褚岩");File file = new File("target/config.xml");JAXbUtils.save(config, file);Config newConfig = JAXbUtils.load(file, Config.class);Assert.assertNotNull(newConfig);Assert.assertEquals(config.map.get(naturalSelection), newConfig.map.get(naturalSelection));Assert.assertEquals(config.map.get(blueSpace), newConfig.map.get(blueSpace));}@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)static class Config {Map<String, String> map = new HashMap<>();}
}

target/config.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config><map><entry><key>自然选择号</key><value>东方延绪</value></entry><entry><key>蓝色空间号</key><value>褚岩</value></entry></map>
</config>

优化 JAXB 转换 MAP

理想状态,可以将其简化为以下形式( 标签名为key,内容为 value ):

<key>value</key>

则需要自定义转换器,将map转换为 w3c 的 Element 对象(其他自定义类型也可以这样实现),实现如下:

package com.c.utils.jaxb;import com.c.utils.LoggerUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.util.HashMap;
import java.util.Map;public class MapAdapter extends XmlAdapter<Object, Map<String, String>> {public static final String TEXT = "#text";@Overridepublic Map<String, String> unmarshal(Object v) {Map<String, String> map = new HashMap<>();if (!(v instanceof Element)) {return map;}NodeList childNodes = ((Element) v).getChildNodes();for (int i = 0; i < childNodes.getLength(); i++) {Node item = childNodes.item(i);if (TEXT.equals(item.getNodeName())) {continue;}map.put(item.getNodeName(), item.getTextContent());}return map;}@Overridepublic Object marshal(Map<String, String> v) {Document document = null;try {document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();} catch (ParserConfigurationException e) {LoggerUtils.getLogger(getClass()).error(e.getMessage(), e);return null;}Element rootElement = document.createElement("map");document.appendChild(rootElement);for (Map.Entry<String, String> entry : v.entrySet()) {Element element = document.createElement(entry.getKey());element.setTextContent(entry.getValue());rootElement.appendChild(element);}return rootElement;}}

然后在需要序列化的 map 字段上加上 @XmlJavaTypeAdapter(MapAdapter.class) 注解。

    @XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)static class Config {@XmlElement(name = "properties")@XmlJavaTypeAdapter(MapAdapter.class)Map<String, String> map = new HashMap<>();}

修改后 target/config.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config><properties><自然选择号>东方延绪</自然选择号><蓝色空间号>褚岩</蓝色空间号></properties>
</config>

使用 JABX 将 Map<String,String> 序列化成 <key>value</key>形式的字符串相关推荐

  1. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  2. C++ STL常用标准库容器入门(vector,map,set,string,list...)

    STL常用标准库容器 C++ STL中最基本以及最常用的类或容器无非就是以下几个: 目录 string vector deque list forward_list queue priority_qu ...

  3. java字符串数组转json_java中字符串String格式转化成json格式

    java字符串数组转json_java中字符串String格式转化成json格式 String s= Connection.deleteHost("10310");System.o ...

  4. java url map_java url转map ,map转string

    1.[代码][Java]代码 package com.jiyuren.fast.utils; import java.util.ArrayList; import java.util.Collecti ...

  5. List<Map<String, Object>>——多层嵌套的数据结构

    文章目录 快速理解多重嵌套结构 Map基础知识 List 例子 查询数据库 快速理解多重嵌套结构 对于多层嵌套的数据结构,需要层层分解. 以List<Map<String, Object& ...

  6. java的map 使用string数组多了双引号_奥奥奥利给!!!再也不怕面试官问我String源码了!来吧...

    简述 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了String 类来创建和操作字符串.字符串缓冲区支持可变字符串.因为String对象是不可变的,因此可以共享 ...

  7. hdu1113 Word Amalgamation(详解--map和string的运用)

    版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/35338617 转载请注明出 ...

  8. Map<String, Object> map=new HashMap<String, Object>();

    HashMap你可以理解成是一对对数据的集合我暂时把List 改成String 你方便理解 Map<String, String> map=new HashMap<String,St ...

  9. Map和String互相转换

    Map to String Set<String> keySet = map.keySet();//将set集合转换为数组String[] keyArray = keySet.toArra ...

最新文章

  1. 不同硬件协议类型,相同的理解思路
  2. SNMP协议简要教程
  3. C++函数调用运算符重载
  4. 数据库面试题【十、【非关系型数据库】和【关系型数据库】的【区别】与【优势比较】】
  5. ntv.js框架(第三章) - 机顶盒HTML和CSS编写注意事项
  6. PHP上传文件到七牛云和阿里云
  7. WordPress疑难问题以及解决方案汇总
  8. Cocos2dx 下对sqlite3 的简单封装
  9. Vijos P1127 级数求和【数列】
  10. 人工智能平台 H2O.ai
  11. 一文让你彻底了解iOS字体相关知识
  12. android开发下载文件损坏解决方法,Android中已下载的.apk文件已损坏
  13. 无人机动力测试台的应用-测试高转速下的无人机螺旋桨结冰和脱落
  14. 陈旿 计算机网络,西北工业大学陈旿教授应邀来校作网络信息安全讲座
  15. 校园兼职平台项目总结
  16. 优矿-python计算上证50之间的相关系数
  17. 启动某个程序的时候,提示端口8000被占用解决方式
  18. 点击按钮,下载二维码图片
  19. Person owns Dog...
  20. CUDA Programming Model--CUDA编程模型

热门文章

  1. 虚拟内存架设服务器客户端,怎么在服务器上开虚拟内存
  2. 用OpenSSL做自签名的证书(by quqi99)
  3. javac的java扩展名_通过命令行方式运行Java程序时,使用的命令是javac,而且要求必须写出该文件的完整文件名,包括扩展名.java。 ( )...
  4. Sawyer智能协作机器人助力注塑公司提升产量
  5. 【微信】Java 微信扫码支付(模式二)
  6. 百度索引是什么如何增加索引
  7. 没NFC功能的手机如何能刷公交卡
  8. 【转】扫描二维码登入安全吗?
  9. 一、基于HTTPS协议的12306抢票软件设计与实现--实现效果
  10. 侯,旬,月,季,年转换为时间