java中使用XStream实现将对象转为xml格式字符串或者将xml格式的字符串转换为对象==
2016-01-05 09:47
645 查看
我们经常会有需求,比如调用别人的接口,别人会返回给你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环境下写的
[code]@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); } } } } }
[code]/** * 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格式的字符串,没有任何效果,而设置之后就可以像我上面截图的那样,节点可以点击展开和关闭,并且数据和节点颜色对比明显,便于观看。
相关文章推荐
- 关于JDK的配置
- java spring中对properties属性文件加密及其解密
- java三大框架原理
- 解决eclipse和studio无法连接developer.android在线更新的解决方法
- java-jdbc
- java-MD5-加密
- 删除java文件内的注释的脚本工具类
- java常用的数据库连接池
- eclipse中编码格式统一设置
- 详解Java编程中线程同步以及定时启动线程的方法
- Java SE 第十一讲----面向对象特征之封装2
- Java 反序列化攻击
- java(10)--DOM之用户登录验证(正则)
- 项目管理神器——Maven篇(三)使用Maven管理Eclipse项目创建、编译、打包
- Java——计算经过了几天
- java里&&与&的区别
- 一个简单的Java死锁示例(转)
- Java中,&&与&,||与|的区别
- java 不可变对象
- Struts 获取 request reuponse session