Java實體在xml和json之間相互轉換
前言
借助Jackson相關工具類可以很方便的實現Java實體在xml和json之間相互轉換。
工具包下載 ↓ ↓ ↓
鏈接:https://pan.baidu.com/s/1M_Yw3MpV1aG1P-x4il2VxQ
提取碼:0jyh
一、相關注解與方法
1.注解(部分)
@JsonProperty
:把屬性的名稱序列化成另一個名稱- @JsonFormat:日期格式轉換(例如:@JsonFormat(timezone="GTM+8",pattern="yyyy-MM-dd HH:mm:ss"))
@JsonIgnoreProperties
:忽略類的某個屬性(作用於類,例如:@JsonIgnoreProperties({"屬性1","屬性2"}))@JsonIgnore
:忽略類的某個屬性(作用於屬性,直接在屬性加注解即可)@JacksonXmlElementWrapper
:可用於指定List等集合類,設置外圍標簽名與是否設置外圍標簽@JacksonXmlProperty
:指定包裝標簽名,或者指定標簽內部屬性名- @JacksonXmlRootElement:指定生成xml根標簽的名字
- @JacksonXmlText:指定當前值,沒有xml標簽包裹
【tips】
在類中的部分屬性使用@JsonProperty和@JacksonXmlProperty注解時,生成的XML字符串標簽順序可能會發生改變
2.方法(主要)
XmlMapper類的方法
- 實體類(任意類型)解析為xml的字符串
String writeValueAsString(Object var1);
- 把字符串轉換為實體類
<T> T readValue(String var1, Class<T> var2);
- 讀取xml字符串為json格式
JsonNode readTree(String var1);
JsonNode類的方法
- 獲取json中的某個節點值
JsonNode get(String var1);
二、使用步驟
1.新建實體類
@Data
public class Student {
private String studentNo;
private String studentName;
}
2.新建測試類
【tips】
代碼中打印語句后的注釋為控制台打印的結果
public class Demo {
//創建XmlMapper對象,用於實體與json和xml之間的相互轉換
private static final XmlMapper XML_MAPPER = new XmlMapper();
public static void main(String[] args) throws Exception {
Student s = new Student();
s.setStudentNo("202101001");
s.setStudentName("張三");
//實體類解析為xml的字符串(理論上可以將任意類型解析為xml字符串)
String xmlStr = XML_MAPPER.writeValueAsString(s);
System.out.println(xmlStr);//<Student xmlns=""><studentNo>202101001</studentNo><studentName>張三</studentName></Student>
//把字符串轉換為實體類
Student student = XML_MAPPER.readValue(xmlStr, Student.class);
System.out.println(student);//Student(studentNo=202101001, studentName=張三)
//讀取xml字符串為json格式
JsonNode jsonNode = XML_MAPPER.readTree(xmlStr);
System.out.println(jsonNode);//{"studentNo":"202101001","studentName":"張三"}
//獲取json中的某一個節點值
JsonNode studentNo = jsonNode.get("studentNo");
System.out.println(studentNo);//"202101001"
}
}
運行結果
三、綜合案例
1.實體類部分
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import lombok.Data;
import java.util.List;
/**
* @author 二師兄想吃肉
* @version V1.0
* @Title:
* @Description:
* @date 2021/1/10 21:40
*/
@Data
@JsonIgnoreProperties({"ignore"})//忽略類的某個屬性
public class Clazz {
//把屬性的名稱序列化成另一個名稱
@JsonProperty("CLAZZNO")
private String clazzNo;
//指定包裝標簽名,或者指定標簽內部屬性名
@JacksonXmlProperty(localName = "CLAZZNAME")
private String clazzName;
//忽略類的某個屬性
@JsonIgnore
private String ignore;
private Teacher teacher;
//不使用外圍標簽
// @JacksonXmlElementWrapper(useWrapping = false)
//指定外圍標簽名
@JacksonXmlElementWrapper(localName = "studentList")
//指定標簽名
@JacksonXmlProperty(localName = "student")
private List<Student> studentList;
}
@Data
class Teacher {
private String teacherName;
private String teacherSex;
}
@Data
class Student {
private String studentNo;
private String studentName;
}
2.測試類部分
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.util.ArrayList;
import java.util.List;
/**
* @author 二師兄想吃肉
* @version V1.0
* @Title:
* @Description:
* @date 2021/1/10 21:43
*/
public class Demo {
//創建XmlMapper對象,用於實體與json和xml之間的相互轉換
private static final XmlMapper XML_MAPPER = new XmlMapper();
public static void main(String[] args) throws Exception{
Clazz c = new Clazz();
c.setClazzNo("201802");
c.setClazzName("三年級2班");
c.setIgnore("這是被忽略的屬性");
Teacher t = new Teacher();
t.setTeacherName("宋老師");
t.setTeacherSex("男");
c.setTeacher(t);
List<Student> students = new ArrayList<>();
Student s1 = new Student();
s1.setStudentNo("202101001");
s1.setStudentName("張三");
Student s2 = new Student();
s2.setStudentNo("202101002");
s2.setStudentName("李四");
students.add(s1);
students.add(s2);
c.setStudentList(students);
//實體類解析為xml的字符串
String xmlStr = XML_MAPPER.writeValueAsString(c);
System.out.println(xmlStr);
//把某一類型的東西轉換為實體類
Clazz clazz = XML_MAPPER.readValue(xmlStr, Clazz.class);
System.out.println(clazz);
//取出Clazz類的studentList屬性並打印
List<Student> studentList = clazz.getStudentList();
System.out.println(studentList);
//讀取xml字符串為json格式
JsonNode jsonNode = XML_MAPPER.readTree(xmlStr);
System.out.print(jsonNode);
}
}
運行結果
<Clazz xmlns=""><teacher><teacherName>宋老師</teacherName><teacherSex>男</teacherSex></teacher><CLAZZNO>201802</CLAZZNO><CLAZZNAME>三年級2班</CLAZZNAME><studentList><student><studentNo>202101001</studentNo><studentName>張三</studentName></student><student><studentNo>202101002</studentNo><studentName>李四</studentName></student></studentList></Clazz>
Clazz(clazzNo=201802, clazzName=三年級2班, ignore=null, teacher=Teacher(teacherName=宋老師, teacherSex=男), studentList=[Student(studentNo=202101001, studentName=張三), Student(studentNo=202101002, studentName=李四)])
[Student(studentNo=202101001, studentName=張三), Student(studentNo=202101002, studentName=李四)]
{"teacher":{"teacherName":"宋老師","teacherSex":"男"},"CLAZZNO":"201802","CLAZZNAME":"三年級2班","studentList":{"student":{"studentNo":"202101002","studentName":"李四"}}}
【tips】
以下個人觀點,還請指正,寫demo的時候發現的問題
使用readTree方法讀取字符串為json格式時,如果讀取到集合類型,那么最終結果可能是集合只會保留一條數據
且為最后一條,之前的有可能會被覆蓋掉
。