说明:
01:jackson
02:XStream
03:实体类和xml和json互相转换。map、list和json转换
一:Jackson(推荐):
1、依赖
<!--版本控制-->
<properties>
<jackson.version>2.11.0</jackson.version>
</properties>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>${jackson.version}</version>
</dependency>
2、创建实体类
老师
:Treacher.java学生
:Student.java
Treacher.java
package sqy.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 lombok.Data;
import java.util.List;
/**
* @author suqinyi
* @Date 2021/4/22
*/
@Data //lombok插件-->get/set等方法(IDEA下载lombok插件,在引入依赖,或者自己生成get、set方法)
//设置标签的名字为TOOT,不设置默认就是类名
@JacksonXmlRootElement(localName="TOOT")
public class Teacher {
private String name;
private Integer age;
@JacksonXmlElementWrapper(localName="item")//增加item标签
@JacksonXmlProperty(localName="TXT")//默认标签名是studentList,将其改成TXT,不设置就是默认属性名
private List<Student> studentList;
}
Student.java
package sqy.xml;
import com.aspose.imaging.internal.bG.S;
import lombok.Data;
/**
* @author suqinyi
* @Date 2021/4/22
*/
@Data
public class Student {
//姓名
private String studentName;
//号码
private int studentNumber;
}
3、创建测试类,准备测试数据
public class Jackson_Xstream_Test {
//用于 json和实体类互转
private ObjectMapper objectMapper = new ObjectMapper();
//用于 xml和实体类互转
private XmlMapper xmlMapper = new XmlMapper();
//准备的测试数据
public Teacher setValue() {
//学生1
Student student01 = new Student();
student01.setStudentName("学生一号");
student01.setStudentNumber(1);
//学生2
Student student02 = new Student();
student02.setStudentName("学生二号");
student02.setStudentNumber(2);
//集合
ArrayList<Student> students = new ArrayList<>();
students.add(student01);
students.add(student02);
//教师
Teacher teacher = new Teacher();
teacher.setName("教师一号");
teacher.setAge(25);
teacher.setStudentList(students);
return teacher;
}
}
4、实体类 转 json
/**
* 实体类转json
*/
@Test
public void BeanToJSON() throws IOException {
//获取测试数据
Teacher teacher = setValue();
//ObjectMapper objectMapper = new ObjectMapper();-->外面创建了
// 实体类转json
String json = objectMapper.writeValueAsString(teacher);
System.out.println("json:" + json);
}
效果:
5、json 转 实体类
/**
* json转实体类
*/
@Test
public void JsonToBean() throws Exception {
String json = "{\"name\":\"教师一号\",\"age\":25,\"studentList\":[{\"studentName\":\"学生一号\",\"studentNumber\":1},{\"studentName\":\"学生二号\",\"studentNumber\":2}]}";
Teacher teacher = objectMapper.readValue(json, Teacher.class);
System.out.println("teacher:" + teacher);
System.out.println("teacher-name:" + teacher.getName());
}
效果:
6、实体类 转 xml
序列化时加上文件头信息 xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
/**
* Jackson
* 实体类 转 xml.
*/
@Test
public void testJavabeanToXml() throws IOException {
//获取值
Teacher teacher = setValue();
// 序列化时加上文件头信息
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
// 实体类 转 xml.
String xml = xmlMapper.writeValueAsString(teacher);
System.out.println("teacher-xml:" + "\n" + xml);
}
效果:
因为在Teacher的实体类设置了标签名,没设置默认属性名
7、xml 转 json
这边有个示例==>
文章入口
/**
* Jackson
* xml转实体
*/
@Test
public void testJavaXmltoBean() throws IOException {
String xmlContent = "<TOOT><name>教师一号</name><age>25</age><item><TXT><studentName>学生一号</studentName><studentNumber>1</studentNumber></TXT><TXT><studentName>学生二号</studentName><studentNumber>2</studentNumber></TXT></item></TOOT>\n";
Teacher teacher = new Teacher();
teacher = xmlMapper.readValue(xmlContent, new TypeReference<Teacher>() {
});
System.out.println(teacher);
}
8、map 转 json
/**
* map 转 json.
*/
@Test
public void MapToJSON() throws JsonProcessingException {
Map<String, Object> map = new HashMap<>();
map.put("name", "map一号");
map.put("power", "黑铁用户");
// map 转 json.
String json = objectMapper.writeValueAsString(map);
System.out.println("json:" + json);
}
效果:
9、json 转 map
/**
* json 转 map
*/
@Test
public void JsonToMap() throws JsonProcessingException {
String json = "{\"name\":\"map一号\",\"power\":\"黑铁用户\"}";
// json 转 map
Map map = objectMapper.readValue(json, Map.class);
System.out.println(map);
System.out.println("name:" + map.get("name"));
}
效果:
二、 Xstream(拓展-古老)
说明
:可能小编对Xstream理解不够深入,不太推荐。个人感觉jackson好用
1、依赖
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
2、简单说明
- 使用Xstream的返回值类型必为void
- 解决办法:xml和实体类互转采用共享一个变量
3、实体类转xml
/**
* 因为Xstream的返回值类型为void
* 所以xml和实体类互转采用共享一个变量
*/
private String shareXml;
/**
* 使用Xstream:可以设置一些其他的数据
* 实体类转xml
* 注明:不太推荐使用,返回值类型必须为void
* 推荐使用jackson
*/
@Test
public void BeanToXML_Xstream() {
//获取值
Teacher teacher = setValue();
XStream xstream = new XStream();
//设置最外面标签别名
xstream.alias("NICE", Teacher.class);
//类型 别名 --> 将 student 改成stu
xstream.alias("stu", Student.class);
//子标签 别名 --> 变换原本的节点名称 studentList 改成 items
xstream.aliasField("items", Teacher.class, "studentList");
//标签属性 别名---体现用的注释掉就没头标签别名
xstream.aliasAttribute(Teacher.class, "name", "name");
//实体类 转 xml
shareXml = xstream.toXML(teacher);
System.out.println(shareXml);
}
效果:
4、XML 转 实体类
说明:必须原路返回,告诉xstream标签别名,才能转换回去
/**
* 使用Xstream
* XML转实体类
*/
@Test
public void XmlToBean_Xstream() {
//给xml赋值 -->就是 上面的那个实体类转xml的方法
BeanToXML_Xstream();
XStream xstream = new XStream();
//注明:必须原路返回,把之前设置别名告诉XStream,才能转换回来
//设置最外面标签别名
xstream.alias("NICE", Teacher.class);
//类型 别名 --> 将 student 改成stu
xstream.alias("stu", Student.class);
//子标签 别名 --> 变换原本的节点名称 studentList 改成 items
xstream.aliasField("items", Teacher.class, "studentList");
//标签属性 别名
xstream.aliasAttribute(Teacher.class, "name", "name");
// xml 转 实体类
Teacher teacher = (Teacher) xstream.fromXML(shareXml);//shareXml 共享字段
System.out.println(teacher);
}
效果:
完整测试代码
package sqy.xml;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.thoughtworks.xstream.XStream;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* @author suqinyi
* @Date 2021/4/22
*/
public class Jackson_Xstream_Test {
//用于 json和实体类互转
private ObjectMapper objectMapper = new ObjectMapper();
//用于 xml和实体类互转
private XmlMapper xmlMapper = new XmlMapper();
//赋值
public Teacher setValue() {
//学生1
Student student01 = new Student();
student01.setStudentName("学生一号");
student01.setStudentNumber(1);
//学生2
Student student02 = new Student();
student02.setStudentName("学生二号");
student02.setStudentNumber(2);
//集合
ArrayList<Student> students = new ArrayList<>();
students.add(student01);
students.add(student02);
//教师
Teacher teacher = new Teacher();
teacher.setName("教师一号");
teacher.setAge(25);
teacher.setStudentList(students);
return teacher;
}
//=================================================
// <TOOT>
// <name>教师一号</name>
// <age>25</age>
// <item>
// <TXT>
// <studentName>学生一号</studentName>
// <studentNumber>1</studentNumber>
// </TXT>
// <TXT>
// <studentName>学生二号</studentName>
// <studentNumber>2</studentNumber>
// </TXT>
// </item>
// </TOOT>
//===================================================
/**
* 实体类转json
*/
@Test
public void BeanToJSON() throws IOException {
//获取值
Teacher teacher = setValue();
// 实体类转json
String json = objectMapper.writeValueAsString(teacher);
System.out.println("json:" + json);
}
/**
* json转实体类
*/
@Test
public void JsonToBean() throws Exception {
String json = "{\"name\":\"教师一号\",\"age\":25,\"studentList\":[{\"studentName\":\"学生一号\",\"studentNumber\":1},{\"studentName\":\"学生二号\",\"studentNumber\":2}]}";
Teacher teacher = objectMapper.readValue(json, Teacher.class);
System.out.println("teacher:" + teacher);
System.out.println("teacher-name:" + teacher.getName());
}
/**
* 实体类 转 xml.
*/
@Test
public void testJavabeanToXml() throws IOException {
//获取值
Teacher teacher = setValue();
// 实体类 转 xml.
String xml = xmlMapper.writeValueAsString(teacher);
System.out.println("teacher-xml:" + "\n" + xml);
}
/**
* map 转 json.
*/
@Test
public void MapToJSON() throws JsonProcessingException {
Map<String, Object> map = new HashMap<>();
map.put("name", "map一号");
map.put("power", "黑铁用户");
// map 转 json.
String json = objectMapper.writeValueAsString(map);
System.out.println("json:" + json);
}
/**
* json 转 map
*/
@Test
public void JsonToMap() throws JsonProcessingException {
String json = "{\"name\":\"map一号\",\"power\":\"黑铁用户\"}";
// json 转 map
Map map = objectMapper.readValue(json, Map.class);
System.out.println(map);
System.out.println("name:" + map.get("name"));
}
//===================== 以下测试Xstream ============================
/**
* 因为Xstream的返回值类型为void
* 所以xml和实体类互转采用共享一个变量
*/
private String shareXml;
/**
* 使用Xstream:可以设置一些其他的数据
* 实体类转xml
* 注明:不太推荐使用,返回值类型必须为void
* 推荐使用jackson
*/
@Test
public void BeanToXML_Xstream() {
//获取值
Teacher teacher = setValue();
XStream xstream = new XStream();
//设置最外面标签别名
xstream.alias("NICE", Teacher.class);
//类型 别名 --> 将 student 改成stu
xstream.alias("stu", Student.class);
//子标签 别名 --> 变换原本的节点名称 studentList 改成 items
xstream.aliasField("items", Teacher.class, "studentList");
//标签属性 别名
xstream.aliasAttribute(Teacher.class, "name", "name");
//实体类 转 xml
shareXml = xstream.toXML(teacher);
System.out.println(shareXml);
}
/**
* 使用Xstream
* XML转实体类
*/
@Test
public void XmlToBean_Xstream() {
//给xml赋值 -->就是 上面的那个实体类转xml的方法
BeanToXML_Xstream();
XStream xstream = new XStream();
//注明:必须原路返回,把之前设置别名告诉XStream,才能转换回来
//设置最外面标签别名
xstream.alias("NICE", Teacher.class);
//类型 别名 --> 将 student 改成stu
xstream.alias("stu", Student.class);
//子标签 别名 --> 变换原本的节点名称 studentList 改成 items
xstream.aliasField("items", Teacher.class, "studentList");
//标签属性 别名
xstream.aliasAttribute(Teacher.class, "name", "name");
// xml 转 实体类
Teacher teacher = (Teacher) xstream.fromXML(shareXml);
System.out.println(teacher);
}
}
其他转换,看我的Json系列文章