添加依賴
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.13.1</version> </dependency>
xml注解介紹
- @JacksonXmlRootElement
- namespace屬性:用於指定XML根元素命名空間的名稱。
- localname屬性:用於指定XML根元素節點標簽的名稱。
- @JacksonXmlProperty
- namespace和localname屬性用於指定XML命名空間的名稱,isAttribute指定該屬 性作為XML的屬性()還是作為子標簽().
- @JacksonXmlText注解將屬性直接作為未被標簽包裹的普通文本表現。
- @JacksonXmlCData將屬性包裹在CDATA標簽中。
- 集合元素的映射
- @JacksonXmlElementWrapper可以將列表數據轉為XML節點。
- useWrapping屬性設置是否設置外圍標簽名,默認true
封裝方法
/** * javaBean轉xml * * @param javaBean javaBean對象 * @return */ public static String javaBean2Xml(Object javaBean) { try { XmlMapper xmlMapper = new XmlMapper(); xmlMapper.setDefaultUseWrapper(false); //字段為null,自動忽略,不再序列化 xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //XML標簽名:使用駱駝命名的屬性名, xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE); //設置轉換模式 xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING); return xmlMapper.writeValueAsString(javaBean); } catch (Exception e) { log.error("對象轉xml失敗,{}", javaBean); return null; } }
案例一
設置根標簽@JacksonXmlRootElement
@Data @JacksonXmlRootElement(localName = "Response") public class YuanTongLogisticsResponseVo { @ApiModelProperty(value = "物流公司ID(必填)") @JacksonXmlProperty private String logisticProviderID; @ApiModelProperty(value = "物流號(必填)") @JacksonXmlProperty private String txLogisticID; @ApiModelProperty(value = "成功失敗標識 true-成功;false-失敗(必填)") @JacksonXmlProperty private boolean success; @ApiModelProperty(value = "失敗原因(可空)") @JacksonXmlProperty private String reason; }
測試一
public static void main(String[] args) { YuanTongLogisticsResponseVo vo = new YuanTongLogisticsResponseVo(); vo.setLogisticProviderID("AAA"); vo.setTxLogisticID("BBBB"); vo.setSuccess(true); vo.setReason("CCC"); System.err.println(CommonUtil.javaBean2Xml(vo)); }
<Response>
<LogisticProviderID>AAA</LogisticProviderID>
<TxLogisticID>BBBB</TxLogisticID>
<Success>true</Success>
<Reason>CCC</Reason>
</Response>
案例二
@JacksonXmlProperty 如果不設置localName默認都是首字母大寫
@Data @JacksonXmlRootElement(localName = "Response") public class YuanTongLogisticsResponseVo { @ApiModelProperty(value = "物流公司ID(必填)") @JacksonXmlProperty(localName = "logisticProviderID", isAttribute = true) private String logisticProviderID; @ApiModelProperty(value = "物流號(必填)") @JacksonXmlProperty(localName = "txLogisticID") private String txLogisticID; @ApiModelProperty(value = "成功失敗標識 true-成功;false-失敗(必填)") @JacksonXmlProperty(localName = "success") private boolean success; @ApiModelProperty(value = "失敗原因(可空)") @JacksonXmlProperty(localName = "reason") private String reason; }
測試二
public static void main(String[] args) { YuanTongLogisticsResponseVo vo = new YuanTongLogisticsResponseVo(); vo.setLogisticProviderID("AAA"); vo.setTxLogisticID("BBBB"); vo.setSuccess(true); vo.setReason("CCC"); System.err.println(CommonUtil.javaBean2Xml(vo)); }
<Response logisticProviderID="AAA">
<txLogisticID>BBBB</txLogisticID>
<success>true</success>
<reason>CCC</reason>
</Response>
案例三
一
@JacksonXmlElementWrapper設置集合外圍標簽名
@Data @JacksonXmlRootElement(localName = "Response") public class YuanTongLogisticsResponseVo { @ApiModelProperty(value = "物流公司ID(必填)") @JacksonXmlProperty(localName = "logisticProviderID") private String logisticProviderID; @ApiModelProperty(value = "物流號(必填)") @JacksonXmlProperty(localName = "txLogisticID") private String txLogisticID; @ApiModelProperty(value = "成功失敗標識 true-成功;false-失敗(必填)") @JacksonXmlProperty(localName = "success") private boolean success; @ApiModelProperty(value = "失敗原因(可空)") @JacksonXmlProperty(localName = "reason") private String reason; @JacksonXmlElementWrapper(localName = "res") @JacksonXmlProperty(localName = "other") private List<YuanTongLogisticsResponseTestVo> res; }
@Data public class YuanTongLogisticsResponseTestVo { @ApiModelProperty(value = "id(必填)") @JacksonXmlProperty(localName = "id") private String id; @ApiModelProperty(value = "name(必填)") @JacksonXmlProperty(localName = "name") private String name; }
測試類
YuanTongLogisticsResponseVo vo = new YuanTongLogisticsResponseVo(); vo.setLogisticProviderID("AAA"); vo.setTxLogisticID("BBBB"); vo.setSuccess(true); vo.setReason("CCC"); List<YuanTongLogisticsResponseTestVo> voList = new ArrayList<>(); YuanTongLogisticsResponseTestVo vo1 = new YuanTongLogisticsResponseTestVo(); vo1.setId("1"); vo1.setName("test01"); YuanTongLogisticsResponseTestVo vo2 = new YuanTongLogisticsResponseTestVo(); vo2.setId("2"); vo2.setName("test02"); voList.add(vo1); voList.add(vo2); vo.setRes(voList); System.err.println(CommonUtil.javaBean2Xml(vo));
<Response>
<logisticProviderID>AAA</logisticProviderID>
<txLogisticID>BBBB</txLogisticID>
<success>true</success>
<reason>CCC</reason>
<res>
<other>
<id>1</id>
<name>test01</name>
</other>
<other>
<id>2</id>
<name>test02</name>
</other>
</res>
</Response>
二
不使用@JacksonXmlElementWrapper設置集合外圍標簽名
@Data @JacksonXmlRootElement(localName = "Response") public class YuanTongLogisticsResponseVo { @ApiModelProperty(value = "物流公司ID(必填)") @JacksonXmlProperty(localName = "logisticProviderID") private String logisticProviderID; @ApiModelProperty(value = "物流號(必填)") @JacksonXmlProperty(localName = "txLogisticID") private String txLogisticID; @ApiModelProperty(value = "成功失敗標識 true-成功;false-失敗(必填)") @JacksonXmlProperty(localName = "success") private boolean success; @ApiModelProperty(value = "失敗原因(可空)") @JacksonXmlProperty(localName = "reason") private String reason; @JacksonXmlProperty(localName = "other") private List<YuanTongLogisticsResponseTestVo> res; }
@Data public class YuanTongLogisticsResponseTestVo { @ApiModelProperty(value = "id(必填)") @JacksonXmlProperty(localName = "id") private String id; @ApiModelProperty(value = "name(必填)") @JacksonXmlProperty(localName = "name") private String name; }
測試類
public static void main(String[] args) { YuanTongLogisticsResponseVo vo = new YuanTongLogisticsResponseVo(); vo.setLogisticProviderID("AAA"); vo.setTxLogisticID("BBBB"); vo.setSuccess(true); vo.setReason("CCC"); List<YuanTongLogisticsResponseTestVo> voList = new ArrayList<>(); YuanTongLogisticsResponseTestVo vo1 = new YuanTongLogisticsResponseTestVo(); vo1.setId("1"); vo1.setName("test01"); YuanTongLogisticsResponseTestVo vo2 = new YuanTongLogisticsResponseTestVo(); vo2.setId("2"); vo2.setName("test02"); voList.add(vo1); voList.add(vo2); vo.setRes(voList); System.err.println(CommonUtil.javaBean2Xml(vo)); }
<Response>
<logisticProviderID>AAA</logisticProviderID>
<txLogisticID>BBBB</txLogisticID>
<success>true</success>
<reason>CCC</reason>
<other>
<id>1</id>
<name>test01</name>
</other>
<other>
<id>2</id>
<name>test02</name>
</other>
</Response>
案例四
@JacksonXmlText注解將屬性直接作為未被標簽包裹的普通文本表現
@Data @JacksonXmlRootElement(localName = "Response") public class YuanTongLogisticsResponseVo { @ApiModelProperty(value = "物流公司ID(必填)") @JacksonXmlText private String logisticProviderID; @ApiModelProperty(value = "物流號(必填)") @JacksonXmlProperty(localName = "txLogisticID") private String txLogisticID; @ApiModelProperty(value = "成功失敗標識 true-成功;false-失敗(必填)") @JacksonXmlProperty(localName = "success") private boolean success; @ApiModelProperty(value = "失敗原因(可空)") @JacksonXmlProperty(localName = "reason") private String reason; }
測試四
public static void main(String[] args) { YuanTongLogisticsResponseVo vo = new YuanTongLogisticsResponseVo(); vo.setLogisticProviderID("AAA"); vo.setTxLogisticID("BBBB"); vo.setSuccess(true); vo.setReason("CCC"); System.err.println(CommonUtil.javaBean2Xml(vo)); }
<Response>AAA <txLogisticID>BBBB</txLogisticID> <success>true</success> <reason>CCC</reason> </Response>
案例五
@JacksonXmlCData將屬性包裹在CDATA標簽中。
@Data @JacksonXmlRootElement(localName = "Response") public class YuanTongLogisticsResponseVo { @ApiModelProperty(value = "物流公司ID(必填)") @JacksonXmlCData private String logisticProviderID; @ApiModelProperty(value = "物流號(必填)") @JacksonXmlProperty(localName = "txLogisticID") private String txLogisticID; @ApiModelProperty(value = "成功失敗標識 true-成功;false-失敗(必填)") @JacksonXmlProperty(localName = "success") private boolean success; @ApiModelProperty(value = "失敗原因(可空)") @JacksonXmlProperty(localName = "reason") private String reason; }
測試四
public static void main(String[] args) { YuanTongLogisticsResponseVo vo = new YuanTongLogisticsResponseVo(); vo.setLogisticProviderID("AAA"); vo.setTxLogisticID("BBBB"); vo.setSuccess(true); vo.setReason("CCC"); System.err.println(CommonUtil.javaBean2Xml(vo)); }
<Response>
<LogisticProviderID><![CDATA[AAA]]></LogisticProviderID>
<txLogisticID>BBBB</txLogisticID>
<success>true</success>
<reason>CCC</reason>
</Response>