首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Gson 解析 JSON 完勝原生 JSONObject:從繁瑣到一行代碼

     編輯:Java 綜合教學

Gson 解析 JSON 完勝原生 JSONObject:從繁瑣到一行代碼

對比原生 org.json 與 Google Gson 解析同一 JSON 資料的代碼量與可維護性,結論顯而易見:有 Gson 沒人願意寫原生解析。

測試 JSON 資料

{
  "status": "000000",
  "desc": null,
  "detail": [
    {"id": 1, "xhid": 100, "author": "張三", "content": "內容1", "picUrl": "url1", "status": "1"},
    {"id": 2, "xhid": 101, "author": "李四", "content": "內容2", "picUrl": "url2", "status": "1"}
  ]
}

原生 JSONObject 解析(痛苦)

public static void jsonParse(String json) {
    List<Detail> details = new ArrayList<>();
    try {
        JSONObject obj = new JSONObject(json);
        if ("000000".equals(obj.getString("status"))) {
            if ("null".equals(obj.getString("desc"))) {
                details = parseArray(details, obj);
                for (Detail d : details) System.out.println(d);
            }
        }
    } catch (JSONException e) { e.printStackTrace(); }
}

private static List<Detail> parseArray(List<Detail> list, JSONObject obj) throws JSONException {
    JSONArray arr = obj.getJSONArray("detail");
    for (int i = 0; i < arr.length(); i++) {
        JSONObject item = arr.getJSONObject(i);
        int id = item.getInt("id");
        int xhid = item.getInt("xhid");
        String author = item.getString("author");
        String content = item.getString("content");
        String picUrl = item.getString("picUrl");
        String status = item.getString("status");
        list.add(new Detail(id, xhid, author, content, picUrl, status));
    }
    return list;
}

缺點:層層 getJSONObject/getJSONArray、手動映射每個欄位、try-catch 繁雜、欄位名寫錯只能運行時發現。

Gson 解析(優雅)

1. 定義資料類 (POJO)

public class Info {
    private String status;
    private String desc;
    private List<Detail> detail; // 對應 JSON "detail" 陣列
    // 必須有無參建構子 + getter/setter
}

public class Detail {
    private int id;
    private int xhid;
    private String author;
    private String content;
    private String picUrl;
    private String status;
    // 建構子、getter/setter、toString()...
}

2. 一行代碼完成解析

public static void gsonParse(String json) {
    Gson gson = new Gson();
    Info info = gson.fromJson(json, Info.class); // 核心:自動映射
    
    if ("000000".equals(info.getStatus()) && info.getDesc() == null) {
        for (Detail d : info.getDetail()) {
            System.out.println(d);
        }
    }
}

進階 Gson 用法

解析 JSON 陣列 → List<T> (TypeToken)

String jsonArray = "[{\"name\":\"李四\",\"age\":40},{\"name\":\"張三\",\"age\":20}]";

// 錯誤寫法:泛型擦除導致 List<Object>
// List list = gson.fromJson(jsonArray, List.class);

// 正確:TypeToken 捕獲泛型資訊
TypeToken<List<User>> token = new TypeToken<List<User>>() {};
List<User> users = gson.fromJson(jsonArray, token.getType());

解析巢狀結構

String nested = "{\"status\":\"ok\",\"data\":[{\"name\":\"李四\",\"age\":30},{\"name\":\"張三\",\"age\":20}]}";

class Wrapper {
    private String status;
    private List<User> data;
    // getter/setter...
}

Wrapper w = gson.fromJson(nested, Wrapper.class);
if ("ok".equals(w.getStatus())) {
    for (User u : w.getData()) System.out.println(u);
}

序列化:物件 → JSON

User[] users = {new User("張三",20), new User("李四",30), new User("王五",40)};
String json = gson.toJson(users);
// [{"name":"張三","age":20},{"name":"李四","age":30},{"name":"王五","age":40}]

List<User> list = Arrays.asList(users);
String json2 = gson.toJson(list); // 同樣結果

總結對比

維度org.jsonGson
代碼量大量樣板代碼極少(聲明式)
類型安全運行時才報錯編譯期檢查 POJO
維護性欄位變更需改多處只改 POJO 即可
效能較低高(流式解析可選)
功能豐富度基礎註解配置、自訂 TypeAdapter、null 處理、日期格式化等

Gson 依賴:com.google.code.gson:gson:2.10+。有 Gson 誰還用原生解析?

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved