使用Jackson處理json數據


1、Jackson 簡介

Jackson 是一個簡單基於 Java 應用庫,Jackson 可以輕松的將 Java 對象轉換成 json 對象和 xml 文檔,同樣也可以將 json、xml 轉換成 Java 對象。Jackson 所依賴的 jar 包較少,簡單易用並且性能也要相對高些,並且 Jackson 社區相對比較活躍,更新速度也比較快。

2、Jackson 特點

  • 容易使用 - jackson API 提供了一個高層次外觀,以簡化常用的用例。
  • 無需創建映射 - API提供了默認的映射大部分對象序列化。
  • 性能高 - 快速,低內存占用,適合大型對象圖表或系統。
  • 干凈的 JSON - jackson 創建一個干凈和緊湊的 JSON 結果,這是讓人很容易閱讀。
  • 不依賴 - 庫不需要任何其他的庫,除了 JDK。
  • 開源代碼 - jackson 是開源的,可以免費使用。

3、Jackson 注解

Jackson 類庫包含了很多注解,可以讓我們快速建立 Java 類與 JSON 之間的關系。

@JsonProperty

@JsonProperty 注解指定一個屬性用於 JSON 映射,默認情況下映射的 JSON 屬性與注解的屬性名稱相同,不過可以使用該注解的 value 值修改 JSON 屬性名,該注解還有一個 index 屬性指定生成 JSON 屬性的順序,如果有必要的話。

@JsonIgnore

@JsonIgnore 注解用於排除某個屬性,這樣該屬性就不會被 Jackson 序列化和反序列化。

@JsonIgnoreProperties

@JsonIgnoreProperties 注解是類注解。在序列化為 JSON 的時候,@JsonIgnoreProperties({"prop1", "prop2"}) 會忽略 pro1 和 pro2 兩個屬性。在從 JSON 反序列化為 Java 類的時候,@JsonIgnoreProperties(ignoreUnknown=true) 會忽略所有沒有 Getter 和 Setter 的屬性。該注解在 Java 類和 JSON 不完全匹配的時候很有用。

@JsonIgnoreType

@JsonIgnoreType 也是類注解,會排除所有指定類型的屬性。

@JsonPropertyOrder

@JsonPropertyOrder 和 @JsonProperty 的 index 屬性類似,指定屬性序列化時的順序。

@JsonRootName

@JsonRootName 注解用於指定 JSON 根屬性的名稱。

4、Jackson 使用實例

對象的序列化與反序列化

    package com.cmcc.hello.httpclient;
    
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import java.io.IOException;
    
    public class JsonTester {
        public static void main(String[] args) {
            // 創建 ObjectMapper 對象
            ObjectMapper mapper = new ObjectMapper();
            String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";
    
            try {
                // 反序列化 JSON 到對象
                Student student = mapper.readValue(jsonString, Student.class);
                System.out.println(student);
    
                // 序列化對象到 JSON
                String json = mapper.writeValueAsString(student);
                System.out.println(json);
            } catch (JsonParseException e) {
                e.printStackTrace();
            } catch (JsonMappingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String toString() {
            return "Student [ name: " + name + ", age: " + age + " ]";
        }
    }
 

集合的序列化與反序列化

    package com.cmcc.hello.httpclient;
    
    import com.fasterxml.jackson.databind.JavaType;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class JsonTester {
        public static void main(String[] args) {
            // 創建 ObjectMapper 對象
            ObjectMapper mapper = new ObjectMapper();
            String jsonString = "{\"draw\":1,\"recordsTotal\":1,\"recordsFiltered\":1,\"data\":[{\"id\":33,\"title\":\"ad1\",\"subTitle\":\"ad1\",\"titleDesc\":\"ad1\",\"url\":\"https://sale.jd.com/act/XkCzhoisOMSW.html\",\"pic\":\"https://m.360buyimg.com/babel/jfs/t20164/187/1771326168/92964/b42fade7/5b359ab2N93be3a65.jpg\",\"pic2\":\"\",\"content\":\"<p><br></p>\"}],\"error\":null}";
    
            try {
                // 反序列化 JSON 到樹
                JsonNode jsonNode = mapper.readTree(jsonString);
    
                // 從樹中讀取 data 節點
                JsonNode jsonData = jsonNode.findPath("data");
                System.out.println(jsonData);
    
                // 反序列化 JSON 到集合
                JavaType javaType = mapper.getTypeFactory().constructParametricType(ArrayList.class, TbContent.class);
                List<TbContent> tbContents = mapper.readValue(jsonData.toString(), javaType);
                for (TbContent tbContent : tbContents) {
                    System.out.println(tbContent);
                }
    
                // 序列化集合到 JSON
                String json = mapper.writeValueAsString(tbContents);
                System.out.println(json);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    class TbContent {
        private Long id;
        private String title;
        private String subTitle;
        private String titleDesc;
        private String url;
        private String pic;
        private String pic2;
        private String content;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getSubTitle() {
            return subTitle;
        }
    
        public void setSubTitle(String subTitle) {
            this.subTitle = subTitle;
        }
    
        public String getTitleDesc() {
            return titleDesc;
        }
    
        public void setTitleDesc(String titleDesc) {
            this.titleDesc = titleDesc;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getPic() {
            return pic;
        }
    
        public void setPic(String pic) {
            this.pic = pic;
        }
    
        public String getPic2() {
            return pic2;
        }
    
        public void setPic2(String pic2) {
            this.pic2 = pic2;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        @Override
        public String toString() {
            return "TbContent{" +
                    "id=" + id +
                    ", title='" + title + '\'' +
                    ", subTitle='" + subTitle + '\'' +
                    ", titleDesc='" + titleDesc + '\'' +
                    ", url='" + url + '\'' +
                    ", pic='" + pic + '\'' +
                    ", pic2='" + pic2 + '\'' +
                    ", content='" + content + '\'' +
                    '}';
        }
    }
轉自:有夢想的咸魚


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM