1. 程式人生 > 其它 >Java實體在xml和json之間相互轉換

Java實體在xml和json之間相互轉換

技術標籤:經驗分享# Java常用APIjsonxmlxml解析java

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(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格式時,如果讀取到集合型別,那麼最終結果可能是集合只會保留一條資料且為最後一條,之前的有可能會被覆蓋掉