您的位置:首页 > 编程语言 > Java开发

java中使用XStream实现将对象转为xml格式字符串或者将xml格式的字符串转换为对象==

2016-03-08 00:00 666 查看
我们经常会有需求,比如调用别人的接口,别人会返回给你json或者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格式的字符串,没有任何效果,而设置之后就可以像我上面截图的那样,节点可以点击展开和关闭,并且数据和节点颜色对比明显,便于观看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: