JAXB实现Java对象和XML转换

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

发布了78 篇原创文章 · 获赞 20 · 访问量 43万+

猜你喜欢

转载自blog.csdn.net/tangyajun_168/article/details/98945360