我们经常会有需求,比如调用别人的接口,别人会返回给你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格式的字符串,没有任何效果,而设置之后就可以像我上面截图的那样,节点可以点击展开和关闭,并且数据和节点颜色对比明显,便于观看。