webService接口中需要用到XML和对象之间的转换,java中可以通过JAXB和XStream实现xml和对象互相转换,下面使用JAXB实现xml和对象的转换。
1.定义要转换为XML的DTO类
import javax.xml.bind.annotation.*;
/**
* @author
* @Description TO DO
* @create
**/
@Data
@XmlRootElement(name="CCService")
@XmlAccessorType(XmlAccessType.FIELD)
public class ComplainWorkOrderDTO {
@XmlElement(name="SysControl")
String sysControl;
@XmlElement(name="ReqControl")
ReqControl reqControl;
@XmlElement(name="ReqInfo")
ReqInfo reqInfo;
@XmlElement(name="ReqParameters")
ReqParameters reqParameters;
@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class ReqControl {
@XmlElement(name="ReqServer")
String reqServer;
@XmlElement(name="Req")
String req;
@XmlElement(name="Serialno")
String serialno;
}
@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class ReqInfo {
@XmlElement(name="ReqType")
String reqType;
@XmlElement(name="ReqUser")
String reqUser;
@XmlElement(name="ReqPwd")
String reqPwd;
@XmlElement(name="ReqSeq")
String reqSeq;
@XmlElement(name="ReqBusiness")
String reqBusiness;
}
@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class ReqParameters {
@XmlElement(name="complainantCategory")
String complainantCategory;
@XmlElement(name="acceptTime")
String acceptTime;
@XmlElement(name="infoFrom")
String infoFrom;
@XmlElement(name="acceptUserName")
String acceptUserName;
@XmlElement(name="infoFromTelephone")
String infoFromTelephone;
@XmlElement(name="complainantInfo")
ComplainantInfo complainantInfo;
@XmlElement(name="defendantInfo")
DefendantInfo defendantInfo;
@XmlElement(name="complaintCauseCode")
String complaintCauseCode;
@XmlElement(name="complaintCauseDescription")
String complaintCauseDescription;
@XmlElement(name="specialDescription")
String specialDescription;
}
@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class ComplainantInfo {
@XmlElement(name="companyCoce")
String companyCoce;
@XmlElement(name="companyName")
String companyName;
@XmlElement(name="policyNo")
String policyNo;
@XmlElement(name="insuranceCode")
String insuranceCode;
@XmlElement(name="firstIssueInsurancePremium")
String firstIssueInsurancePremium;
@XmlElement(name="effectiveDate")
String effectiveDate;
@XmlElement(name="policyStatus")
String policyStatus;
@XmlElement(name="addupInsurancePremium")
String addupInsurancePremium;
@XmlElement(name="complainantName")
String complainantName;
@XmlElement(name="complainantStatus")
String complainantStatus;
@XmlElement(name="gender")
String gender;
@XmlElement(name="birthDate")
String birthDate;
@XmlElement(name="complainTelephoneNo")
String complainTelephoneNo;
@XmlElement(name="complainTelephoneMobile")
String complainTelephoneMobile;
@XmlElement(name="relatedSeries")
String relatedSeries;
}
@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class DefendantInfo {
@XmlElement(name="defendantName")
String defendantName;
@XmlElement(name="defendantStatus")
String defendantStatus;
@XmlElement(name="companyCode")
String companyCode;
@XmlElement(name="companyName")
String companyName;
@XmlElement(name="branchCode")
String branchCode;
@XmlElement(name="branchName")
String branchName;
}
}
2.编写xml和Java对象的转换类
/**
* @author
* @Description TO DO
* @create
**/
public final class XmlUtils {
/**
* 将XML转为JavaBean
* @param xml xml字符串
* @param clazz class对象
* @param <T>
* @return 返回转换后的对象
*/
public static <T> T xml2JavaBean(String xml,Class<T> clazz) {
T t=null;
try {
JAXBContext jaxbContext=JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller=jaxbContext.createUnmarshaller();
t=(T)unmarshaller.unmarshal(new StringReader(xml));
} catch (JAXBException e) {
e.printStackTrace();
}
return t;
}
/**
* 将JavaBean转为XML
* @param object java对象
* @return 返回转换后的xml字符串
*/
public static String javaBean2Xml(Object object) {
StringBuilder builder=new StringBuilder();
builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
StringWriter writer=null;
try {
JAXBContext jaxbContext=JAXBContext.newInstance(object.getClass());
Marshaller marshaller=jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT,true);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
marshaller.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");
writer=new StringWriter();
marshaller.marshal(object,writer);
} catch (JAXBException e) {
e.printStackTrace();
}
builder.append(writer);
return builder.toString();
}
}
3.测试
public class XmlConverterTest {
public static void main(String[] args) {
testJavaBean2Xml();
}
public static void testXml2JavaBean() {
String xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<CCService><SysControl></SysControl><ReqControl><ReqServer></ReqServer><Req>192180327000001</Req><Serialno></Serialno></ReqControl><ReqInfo><ReqType>CallCenter</ReqType><ReqUser>admin</ReqUser><ReqPwd>123456</ReqPwd><ReqSeq>192180327000001</ReqSeq><ReqBusiness>acceptComplaint</ReqBusiness></ReqInfo><ReqParameters><complainantCategory>2</complainantCategory><acceptTime>2018-03-01 17:19:00.0</acceptTime><infoFrom></infoFrom><acceptUserName>admin</acceptUserName><infoFromTelephone>7217292</infoFromTelephone><complainantInfo><companyCode></companyCode><companyName>北京分公司</companyName><policyNo>ZZ721729</policyNo><insuranceCode></insuranceCode><insuranceCategory>千里马分红险</insuranceCategory><firstIssueInsurancePremium>10000</firstIssueInsurancePremium><effectiveDate>2014-03-12 00:00:00.0</effectiveDate><policyStatus>有效</policyStatus><addupInsurancePremium></addupInsurancePremium><complainantName>牛华</complainantName><complainantStatus>250001</complainantStatus><gender>1</gender><birthDate></birthDate><complainTelephoneNo>15001219182</complainTelephoneNo><complainTelephoneMobile>15001219182</complainTelephoneMobile><relatedSeries>1</relatedSeries></complainantInfo><defendantInfo><defendantName>不知道</defendantName><defendantStatus>1400001</defendantStatus><companyCode>1</companyCode><companyName>北京分公司</companyName><branchCode>340</branchCode><branchName>北京分公司本部</branchName></defendantInfo><complaintCauseCode>910001005002</complaintCauseCode><complaintCauseDescription>伪造保险资料</complaintCauseDescription><specialDescription>冒烟</specialDescription></ReqParameters></CCService>";
ComplainWorkOrderDTO complainWorkOrderDTO=XmlUtils.xml2JavaBean(xml, ComplainWorkOrderDTO.class);
String json=JSON.toJSONString(complainWorkOrderDTO);
System.out.println("-------------------"+json);
}
public static void testJavaBean2Xml() {
String json="{\"reqControl\":{\"req\":\"192180327000001\",\"reqServer\":\"\",\"serialno\":\"\"},\"reqInfo\":{\"reqBusiness\":\"acceptComplaint\",\"reqPwd\":\"123456\",\"reqSeq\":\"192180327000001\",\"reqType\":\"CallCenter\",\"reqUser\":\"admin\"},\"reqParameters\":{\"acceptTime\":\"2018-03-01 17:19:00.0\",\"acceptUserName\":\"admin\",\"complainantCategory\":\"2\",\"complainantInfo\":{\"addupInsurancePremium\":\"\",\"birthDate\":\"\",\"companyName\":\"北京分公司\",\"complainTelephoneMobile\":\"15001219182\",\"complainTelephoneNo\":\"15001219182\",\"complainantName\":\"牛华\",\"complainantStatus\":\"250001\",\"effectiveDate\":\"2014-03-12 00:00:00.0\",\"firstIssueInsurancePremium\":\"10000\",\"gender\":\"1\",\"insuranceCode\":\"\",\"policyNo\":\"ZZ721729\",\"policyStatus\":\"有效\",\"relatedSeries\":\"1\"},\"complaintCauseCode\":\"910001005002\",\"complaintCauseDescription\":\"伪造保险资料\",\"defendantInfo\":{\"branchCode\":\"340\",\"branchName\":\"北京分公司本部\",\"companyCode\":\"1\",\"companyName\":\"北京分公司\",\"defendantName\":\"不知道\",\"defendantStatus\":\"1400001\"},\"infoFrom\":\"\",\"infoFromTelephone\":\"7217292\",\"specialDescription\":\"冒烟\"},\"sysControl\":\"\"}";
ComplainWorkOrderDTO complainWorkOrderDTO=JSON.parseObject(json,ComplainWorkOrderDTO.class);
String xml=XmlUtils.javaBean2Xml(complainWorkOrderDTO);
System.out.println(xml);
}
}
参考
https://wiselyman.iteye.com/blog/1543928
https://blog.csdn.net/aqsunkai/article/details/52244610