java 與 JSON


Java 與 JSON

JSON 是不同程序之間傳遞信息的一種格式。本文描述了 JSON 在 Java 中的應用。
目前 Java 中比較主流的相關解析工具有谷歌提供的 Gson 和阿里提供的 FastJSON 。

一、JSON 格式

JSON: JavaScript Object Notation(JS對象簡譜),是一種輕量級的數據交換格式。
例如一本書,有 id 屬性值為 "1001",有 name 屬性值為 "book",有 info 屬性值為 "簡介",用 JSON 表示如下:

{
  "id":"1001",
  "name":"book",
  "info":"簡介"
}

另外,JSON 格式中還可以包含數組(用中括號包含[,,,]),對象之間還可以互相嵌套。
例如一個櫃子,名字是 "書櫃",有一個 "books" 屬性包含了三本書,還有一個 belong 屬性表示屬於某個人,可以表示為:

{
  "name":"書櫃",
  "books":["book1","book2",{
    "id":"1001",
    "name":"book",
    "info":"簡介"
  }],
  "belong":{
    "name":"張三",
    "age":18,
  }
}

二、Java 與 JSON

1. Gson

使用 Gson 類的一個實例可以將一串包含 JSON 的字符串中的數據解析為一個 Java 對象的實例,也可以將一個類的信息保存到一串 JSON 字符串中。
后文中的代碼使用的 Book 類和 Cabinet 類如下

class Book {

    private int id;
    private String name;
    private String info;

    public String toString() {
        return "name:" + name + ", info:" + info;
    }

}

class Cabinet {

    private String name;
    private Book[] books;
    private String belong;

    public String toString() {
        return "Cabinet{" +
                "name='" + name + '\'' +
                ", books=" + Arrays.toString(books) +
                ", belong='" + belong + '\'' +
                '}';
    }

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cabinet cabinet = (Cabinet) o;
        return Objects.equals(name, cabinet.name) && Arrays.equals(books, cabinet.books) && Objects.equals(belong, cabinet.belong);
    }

    public int hashCode() {
        int result = Objects.hash(name, belong);
        result = 31 * result + Arrays.hashCode(books);
        return result;
    }

    public Cabinet() {}

    public Cabinet(String name, Book[] books, String belong) {
        this.name = name;
        this.books = books;
        this.belong = belong;
    }

}
  • 保存信息: toJson(Object src)方法
    • 將一個類保存為 json 格式
    import com.google.gson.Gson;
    
    public class Demo1 {
        public static void main(String[] args) {
            // 創建 Gson 對象
            Gson gson = new Gson();
            Book b = new Book(1001, "book", "info");
    
            // 將一個對象 b 轉換為 json 字符串
            String s = gson.toJson(b);
            System.out.println(s);
        }
    }
    
    • 將一個集合保存為 json 格式
    import com.google.gson.Gson;
    import java.util.ArrayList;
    public class Demo2 {
        public static void main(String[] args) {
            // 創建 Gson 對象
            Gson gson = new Gson();
            ArrayList<Object> list = new ArrayList<>();
            list.add("abc");
            list.add(new Book(1001, "book", "info"));
            // 將一個集合 list 轉換為 json 字符串
            String s = gson.toJson(list);
            System.out.println(s);
        }
    }
    
    • 將一個復雜的對象用 json 格式保存到文件中
    import com.google.gson.Gson;
    import java.io.*;
    public class Demo3 {
        public static void main(String[] args) throws IOException {
            // 創建 Gson 對象
            Gson gson = new Gson();
            // 將一個復雜的對象轉換為字符串
            String s = gson.toJson(new Cabinet("Cabinet",
                    new Book[]{new Book(1001, "book1", "info1"),
                            new Book(1002, "book2", "info2"),
                            new Book(1003, "book3", "info3")}, "張三"));
            // 將獲得的字符串寫入文件中
            FileWriter fw = new FileWriter("cabinet.json");
            fw.write(s);
            fw.close(); // 記得關閉流!
        }
    }
    
  • 解析 JSON 字符串: fromJson(String json, Class classOfT) 方法
    • 解析一個類
    import com.google.gson.Gson;
    public class Demo4 {
      public static void main(String[] args) {
        Gson gson = new Gson();
        // {"name":"book","info":"abc"}
        Book book = gson.fromJson("{\"name\":\"book\",\"info\":\"abc\"}", Book.class);
        System.out.println(book);
      }
    }
    
    • 解析一個數組
    import com.google.gson.Gson;
    import java.util.List;
    public class Demo5 {
      public static void main(String[] args) {
        // ["abc","bcd","cde"]
        List list = new Gson().fromJson("[\"abc\",\"bcd\",\"cde\"]",List.class);
        for (Object s : list) {
          System.out.println(s);
        }
      }
    }
    
    • 從文件中解析一個較為復雜的類
    import com.google.gson.Gson;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    public class Demo6 {
        public static void main(String[] args) throws IOException {
            // 此處使用的文件為上面代碼中保存的 cabinet.json 文件
            // 讀取文件中的數據
            BufferedReader br = new BufferedReader(new FileReader("cabinet.json"));
            String s = br.readLine();
            br.close(); // 別忘記關閉!
            // 創建 Gson 對象
            Gson gson = new Gson();
            // 如果我們沒有 Cabinet 這個類,則可以轉化為 HashMap 對象
            HashMap hashMap = gson.fromJson(s, HashMap.class);
            // 打印全部
            System.out.println(hashMap);
            List<Book> list = (List<Book>) hashMap.get("books");
            // 打印 books
            System.out.println(list.get(1));
        }
    }
    

注意:JSON 字符串應該對應好對應類的各個屬性名,如果 JSON 字符串中出現了對應類中沒有的屬性名,那么這個屬性將被忽略。同理,如果 JSON 字符串中沒有對應類中的屬性,那么對應的類的這個屬性設置為默認值。

2.FastJSON

使用 FastJSON 解析或保存 JSON 字符串方法:

  • 保存信息: toJSONString(Object object)方法
    注意:使用 FastJSON 保存的類每個屬性必須有 get 方法,否則無法保存。上面的 Book 類沒有提供 get 方法,則無法保存。
    • 保存一個類的信息
    import com.alibaba.fastjson.JSON;
    public class Demo {
        public static void main(String[] args) {
            // 假設這個類有提供 get 方法
            Book b = new Book(1001, "book", "info");
            // 轉化為 JSON 字符串
            String s = JSON.toJSONString(b);
            // 打印出來檢查是否正確
            System.out.println(s);
        }
    }
    
    • 保存一個集合(數組)的信息
    import com.alibaba.fastjson.JSON;
    public class Demo {
        public static void main(String[] args) {
            // 這里假設 Book 類有提供 get 方法
            Book[] b = new Book[]{new Book(1001, "book", "info"), new Book(1002, "abc", "ofni")};
            String s = JSON.toJSONString(b);
            System.out.println(s);
        }
    }
    
    • 保存一個較為復雜的類到文件中
    import com.alibaba.fastjson.JSON;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class Demo {
        public static void main(String[] args) throws IOException {
            Book b1 = new Book(1001, "1", "a");
            Book b2 = new Book(1002, "2", "b");
            Book b3 = new Book(1003, "3", "c");
            Book[] bs = {b1, b2, b3};
            Cabinet c = new Cabinet("cabinet", bs, "abc");
            String json = JSON.toJSONString(c);
            FileWriter fw = new FileWriter("cabinet2.json");
            fw.write(json);
            fw.close();
        }
    }
    
  • 解析 JSON 字符串: parseObject(String text, Class clazz) 方法
    注意:獲取信息的類必須提供 無參構造方法和各個 set 方法,否則會出現 JSONException 異常
    • 解析得到一個類的信息
    import com.alibaba.fastjson.JSON;
    public class Demo {
        public static void main(String[] args){
            // {"id":1001,"name":"b","info":"1"}
            Book b = JSON.parseObject("{\"id\":1001,\"name\":\"b\",\"info\":\"1\"}", Book.class);
            System.out.println(b);
        }
    }
    
    • 解析得到一個數組信息
    import com.alibaba.fastjson.JSON
    import java.io.IOException;
    import java.util.List;
    public class Demo {
        public static void main(String[] args) {
            // ["",{"id":123,"name":"abc"},null]
            List list = (List) JSON.parse("[\"\",{\"id\":123,\"name\":\"abc\"},null]");
            System.out.println(list.get(1));
        }
    }
    
    • 從文件中解析得到一個較為復雜的對象
    import com.alibaba.fastjson.JSON;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    public class Demo {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new FileReader("cabinet2.json"));
            String s = br.readLine();
            HashMap hashMap = JSON.parseObject(s, HashMap.class);
            System.out.println(hashMap);
            List list = (List) hashMap.get("books");
            System.out.println(list.get(1));
            HashMap book2 = JSON.parseObject(list.get(1).toString(), HashMap.class);
            System.out.println(book2.get("name"));
        }
    }
    


免責聲明!

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



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