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")); } }