前言
博主github
博主個人博客http://blog.healerjean.com
1 、解釋
1.1、@JacksonXmlRootElement
指定生成xml根標籤的名字;
1.2、@JacksonXmlProperty
指定包裝標籤名,或者指定標籤內部屬性名;
1.3、@JacksonXmlElementWrapper
用於指定List等集合類,外圍標籤名;用在非集合類上無效
1.4、@JacksonXmlText:
指定當前這個值,沒有xml標籤包裹。
2、測試
2.1、測試DTO
package com.healerjean.proj.a_test.xml;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* @author HealerJean
* @ClassName Group
* @date 2019/10/29 22:20.
* @Description
*/
@Data
// @JacksonXmlRootElement:指定生成xml根標籤的名字;
@JacksonXmlRootElement(localName = "Class")
public class Group {
private Teacher teacher;
// @JacksonXmlElementWrapper:可用於指定List等集合類,外圍標籤名;
@JacksonXmlElementWrapper(localName = "Students")
// @JacksonXmlProperty:指定包裝標籤名,或者指定標籤內部屬性名;
@JacksonXmlProperty(localName = "Stu")
private List<Student> student;
@Data
@AllArgsConstructor
public static class TeacherType {
@JacksonXmlProperty(isAttribute = true, localName = "type")
private String type;
//@JacksonXmlText:指定當前這個值,沒有xml標籤包裹。
// 這個值意義在於,一般這個值所在的類只有這一個正常屬性,或者其他屬性全部爲 @JacksonXmlProperty(isAttribute = true,
@JacksonXmlText
private String grade;
}
@Data
public static class Teacher {
@JacksonXmlProperty(localName = "TypeCode")
private TeacherType teacherTypeCode;
private String name;
}
@Data
public static class Student {
@JacksonXmlProperty(isAttribute = true, localName = "stu_id")
private String id;
private String name;
private Integer age;
}
}
2.2、測試類
@Test
public void test() {
Group group = new Group();
Group.Teacher teacher = new Teacher();
teacher.setTeacherTypeCode(new TeacherType("語文老師", "A"));
teacher.setName("馬老師");
group.setTeacher(teacher);
Student student = new Student();
student.setId("001");
student.setName("HealerJean");
student.setAge(25);
group.setStudent(Arrays.asList(student));
String xml = XmlUtils.toXml(group);
log.info("數據原文:【 {} 】", xml);
}
//XML標籤名:使用駱駝命名的屬性名,
xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
<Class>
<Teacher>
<Name>馬老師</Name>
<TypeCode type="語文老師">A</TypeCode>
</Teacher>
<Students>
<Stu stu_id="001">
<Name>HealerJean</Name>
<Age>25</Age>
</Stu>
</Students>
</Class>
自定義的轉化轉大寫並加下劃線,強制命令的不可以,比如下面的Class是強制命名的
xmlMapper.setPropertyNamingStrategy(new UpperCaseSnackNamingStrategy());
<Class>
<TEACHER>
<NAME>馬老師</NAME>
<TypeCode type="語文老師">A</TypeCode>
</TEACHER>
<Students>
<Stu stu_id="001">
<NAME>HealerJean</NAME>
<AGE>25</AGE>
</Stu>
</Students>
</Class>
3、工具類
3.1、XmlUtils
package com.healerjean.proj.util.xml;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.healerjean.proj.util.xml.strategy.UpperCaseSnackNamingStrategy;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Slf4j
public class XmlUtils {
public static final XmlMapper xmlMapper;
static {
xmlMapper = new XmlMapper();
SimpleModule module = new SimpleModule();
xmlMapper.registerModule(module);
xmlMapper.setDefaultUseWrapper(false);
//字段爲null,自動忽略,不再序列化
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//XML標籤名:使用駱駝命名的屬性名,
// xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
//轉化成加下劃線和大寫
xmlMapper.setPropertyNamingStrategy(new UpperCaseSnackNamingStrategy());
//設置轉換模式
xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
}
public static String toXml(Object object) {
try {
return xmlMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
log.error("Xml轉換失敗", e);
throw new RuntimeException("Xml轉換失敗", e);
}
}
public static <T> T toObject(String xml, Class<T> c) {
try {
return xmlMapper.readValue(xml, c);
} catch (IOException e) {
log.error("Xml轉換失敗", e);
throw new RuntimeException("Xml轉換失敗", e);
}
}
}
3.2、轉大寫並加下劃線
package com.healerjean.proj.util.xml.strategy;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
/**
* @author HealerJean
* @version 1.0v
* @ClassName UpperCaseSnackNamingStrategy
* @Date 2019/10/29 22:48.
* @Description 轉大寫並加下劃線
*/
public class UpperCaseSnackNamingStrategy extends PropertyNamingStrategy.PropertyNamingStrategyBase {
@Override
public String translate(String input) {
if (input == null) {
return input;
}
int length = input.length();
StringBuilder result = new StringBuilder(length * 2);
int resultLength = 0;
boolean wasPrevTranslated = false;
for (int i = 0; i < length; i++) {
char c = input.charAt(i);
if (i > 0 || c != '_') {
if (Character.isUpperCase(c)) {
if (!wasPrevTranslated && resultLength > 0 && result.charAt(resultLength - 1) != '_') {
result.append('_');
resultLength++;
}
wasPrevTranslated = true;
} else {
wasPrevTranslated = false;
}
c = Character.toUpperCase(c);
result.append(c);
resultLength++;
}
}
return resultLength > 0 ? result.toString() : input;
}
}