java中使用XStream实现将对象转为xml格式字符串或者将xml格式的字符串转换为对象==
2016-03-08 00:00
666 查看
我们经常会有需求,比如调用别人的接口,别人会返回给你json或者xml格式的数据,然后我们要转换为相应的对象供我们自己使用;
也有的时候是别人的调我们的接口,让我们提供xml格式的数据或者json格式的数据,json的话这里都不说了,很好处理,甚至springMvc本身就很容易支持。
下面只介绍xml和对象彼此转换
首先我们需要引入的jar包:xstream-1.4.8.jar
下面直接贴代码,代码是在springMvc环境下写的
实现方法很简单另外这里说一下response的几个参数设置的意思。
response.setCharacterEncoding(CharsetType.UTF8);
设置返回数据的编码格式如果不设置这个,返回到客户请求端的数据可能会乱码,这个编码格式一定要统一掉
response.setContentType(“application/xml”);
设置内容类型,决定浏览器将以什么类型读我们返回的数据进行展示,如果不设置,那么浏览器显示的就是一大坨xml格式的字符串,没有任何效果,而设置之后就可以像我上面截图的那样,节点可以点击展开和关闭,并且数据和节点颜色对比明显,便于观看。
也有的时候是别人的调我们的接口,让我们提供xml格式的数据或者json格式的数据,json的话这里都不说了,很好处理,甚至springMvc本身就很容易支持。
下面只介绍xml和对象彼此转换
首先我们需要引入的jar包:xstream-1.4.8.jar
下面直接贴代码,代码是在springMvc环境下写的
@Controller public class NavigationAppDataController extends BaseController{ @SuppressWarnings("unused") private static final Logger log = LoggerFactory.getLogger(NavigationAppDataController.class); @Autowired private StoNavigationAppManager stoNavigationAppManager; @RequestMapping(value = "/appsite/getNavigationXmlData.htm") public void getNavigationXmlData(HttpServletRequest request,HttpServletResponse response){ List<NavigationAppCommand> findStoreNavigationAppToXml = stoNavigationAppManager.findStoreNavigationAppData(); XStreamConfig xStreamConfig = new XStreamConfig(); // 这里是什么意思我下面文字中会介绍,大概就是对xml中节点进行重命名的 xStreamConfig.getAliasMap().put("topcategories", List.class); xStreamConfig.getAliasMap().put("category", NavigationAppCommand.class); String xml = toXML(findStoreNavigationAppToXml, xStreamConfig); // 设置返回数据的编码格式 response.setCharacterEncoding(CharsetType.UTF8); // 设置内容类型,决定浏览器将以什么类型读我们返回的数据进行展示 response.setContentType("application/xml"); // 将数据写入response返回给请求端 response.getWriter().write(xml); } /** * 将bean对象根据xStreamConfig格式转成xml格式的字符串返回 * * @param bean * 对象 * @param xStreamConfig * 配置 * @return */ public static String toXML(Object bean,XStreamConfig xStreamConfig){ XStream xstream = constructXStream(xStreamConfig); return xstream.toXML(bean); } /** * 将xml字符串转为相对应的对象 * * @param xml * @return */ public static <T> T fromXML(String xml){ return fromXML(xml, null); } public static <T> T fromXML(String xml,XStreamConfig xStreamConfig){ XStream xstream = constructXStream(xStreamConfig); return (T) xstream.fromXML(xml); } public static XStream constructXStream(XStreamConfig xStreamConfig){ XStream xstream = new XStream(); if (Validator.isNotNullOrEmpty(xStreamConfig)){ // *******************alias******************************************** Map<String, Class<?>> aliasMap = xStreamConfig.getAliasMap(); if (Validator.isNotNullOrEmpty(aliasMap)){ for (Map.Entry<String, Class<?>> entry : aliasMap.entrySet()){ String key = entry.getKey(); Class<?> value = entry.getValue(); // 类重命名 xstream.alias(key, value); } } // *******************implicitCollectionMap******************************************** Map<String, Class<?>> implicitCollectionMap = xStreamConfig.getImplicitCollectionMap(); if (Validator.isNotNullOrEmpty(implicitCollectionMap)){ for (Map.Entry<String, Class<?>> entry : implicitCollectionMap.entrySet()){ String key = entry.getKey(); Class<?> value = entry.getValue(); xstream.addImplicitCollection(value, key); } } } } }
/** * XStream相关配置. * */ public final class XStreamConfig{ /** 别名. */ private Map<String, Class<?>> aliasMap = new HashMap<String, Class<?>>(); /** 隐式集合 隐藏,隐藏,比如下面有list,泛型中的第二个参数 Class 是 ownerType. */ private Map<String, Class<?>> implicitCollectionMap = new HashMap<String, Class<?>>(); /** * 获得 别名. * * @return the aliasMap */ public Map<String, Class<?>> getAliasMap(){ return aliasMap; } /** * 设置 别名. * * @param aliasMap * the aliasMap to set */ public void setAliasMap(Map<String, Class<?>> aliasMap){ this.aliasMap = aliasMap; } /** * 获得 隐式集合 隐藏,隐藏,比如下面有list,泛型中的第二个参数 Class 是 ownerType. * * @return the implicitCollectionMap */ public Map<String, Class<?>> getImplicitCollectionMap(){ return implicitCollectionMap; } /** * 设置 隐式集合 隐藏,隐藏,比如下面有list,泛型中的第二个参数 Class 是 ownerType. * * @param implicitCollectionMap * the implicitCollectionMap to set */ public void setImplicitCollectionMap(Map<String, Class<?>> implicitCollectionMap){ this.implicitCollectionMap = implicitCollectionMap; } }
实现方法很简单另外这里说一下response的几个参数设置的意思。
response.setCharacterEncoding(CharsetType.UTF8);
设置返回数据的编码格式如果不设置这个,返回到客户请求端的数据可能会乱码,这个编码格式一定要统一掉
response.setContentType(“application/xml”);
设置内容类型,决定浏览器将以什么类型读我们返回的数据进行展示,如果不设置,那么浏览器显示的就是一大坨xml格式的字符串,没有任何效果,而设置之后就可以像我上面截图的那样,节点可以点击展开和关闭,并且数据和节点颜色对比明显,便于观看。
相关文章推荐
- springMVC中使用List和Map绑定对象作为参数的使用方法
- 使用Spring的JAVA Mail支持简化邮件发送
- java中split的坑,用的时候一定要小心
- Git中的AutoCRLF与SafeCRLF换行符问题(及eclipse设置)
- Java小并发下短期任务的线程池
- /.org.eclipse.jdt.core.external.folders/.link0解决方法
- java变量命名规范
- IntelliJ IDEA 14.0 添加及显示 JDK DOC
- java URL中文乱码
- 深入理解Java 虚拟机(周志明)笔记(二)——Java数据分区
- 深入理解Java 虚拟机(周志明)笔记(一)——Java虚拟机发展史
- LeetCode : Merge k Sorted Lists [java]
- Struts2 用 s:if test 判断属性和字符串相等时 注意双引号和单引号的使用 《转》
- 为什么JAVA的垃圾回收机制无法避免内存泄漏
- 7. SpringMVC 数据验证
- Java [Leetcode 144]Binary Tree Preorder Traversal
- 编写web遇到javabean的一个错误
- SpringMVC Controller 介绍
- 修改JAVA_HOME无效,java版本保持不变的问题解决
- java中CAS算法保证原子性 无锁编程