项目引入maven
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.18</version>
</dependency>
/**
* 必须是 annotation driven
*/
public class XmlUtils {
private static Map<Class<?>, XStream> xStreamMap = Collections.synchronizedMap(new HashMap<Class<?>, XStream>());
/**
* xml to obj
*/
public static <T> T deserializeXml(String xml, Class<T> t) {
if (StringUtils.isEmpty(xml)) {
return null;
}
XStream xstream = getXStreamInstance(t);
return (T)xstream.fromXML(xml);
}
/**
* obj to xml
*/
public static String toXml(Object obj) {
if (obj == null) {
return StringUtils.EMPTY;
}
XStream xstream = getXStreamInstance(obj.getClass());
return xstream.toXML(obj);
}
/**
* thread-safe
*
* @param clazz
* @return
*/
private static XStream getXStreamInstance(Class<?> clazz) {
if (xStreamMap.containsKey(clazz)) {
return xStreamMap.get(clazz);
}
synchronized (clazz) {
if (xStreamMap.containsKey(clazz)) {
return xStreamMap.get(clazz);
}
XStream xstream = new XStream(new DomDriver(CommonConstant.CHARSET_UTF, new XmlFriendlyNameCoder("_-", "_"))) {
@Override
protected MapperWrapper wrapMapper(MapperWrapper next) {
return new MapperWrapper(next) {
@Override
public boolean shouldSerializeMember(Class definedIn, String fieldName) {
if (definedIn == Object.class) {
//This is not compatible with implicit collections where item name is not defined
return false;
} else {
return super.shouldSerializeMember(definedIn, fieldName);
}
}
};
}
};
xstream.processAnnotations(clazz);
xstream.autodetectAnnotations(true);
xstream.ignoreUnknownElements();
xstream.registerConverter(new DateConverter(TimeZone.getDefault()));
Class[] classes = new Class[]{clazz};
xstream.allowTypes(classes);
xStreamMap.put(clazz, xstream);
return xstream;
}
}
public static void main(String[] args) {
System.out.println(JSON.toJSONString(XmlUtils.deserializeXml(XmlUtils.toXml(
new XmlIssueOrCancelCallBack1(
InvoiceGuoPiaoCallBackResponseEnum.ERROR_9999.getCode(),
"Xml2222推送失败thread22222222")), XmlIssueOrCancelCallBack1.class)));
}
}
@XStreamAlias("RESPONSE1")
class XmlIssueOrCancelCallBack1 {
@XStreamAlias("RSCODE")
private String rsCode;
@XStreamAlias("RSMSG")
private String rsMsg;
@XStreamAlias("DATA")
private XmlIssueOrCancelCallBackData data;
public String getRsCode() {
return rsCode;
}
public void setRsCode(String rsCode) {
this.rsCode = rsCode;
}
public String getRsMsg() {
return rsMsg;
}
public void setRsMsg(String rsMsg) {
this.rsMsg = rsMsg;
}
public XmlIssueOrCancelCallBackData getData() {
return data;
}
public void setData(XmlIssueOrCancelCallBackData data) {
this.data = data;
}
public XmlIssueOrCancelCallBack1(String rsCode, String rsMsg) {
this.rsCode = rsCode;
this.rsMsg = rsMsg;
}
}