在 Java 開發中,JSON 與物件的相互轉換是日常高頻操作。本文將介紹三種主流方案——JSON-lib、Jackson、Gson,並針對複雜巢狀結構給出最佳實踐建議。
JSON-lib 是早期常用的庫,依賴 commons-lang、commons-beanutils 等第三方包。對於簡單 POJO 轉換尚可,但面對多層巢狀 JSON 時,程式碼冗長且效能一般,目前較少在新專案中採用。
Jackson 是 Spring Boot 預設的 JSON 處理器,效能優異、功能豐富,支援流式解析、樹模型、資料綁定三種模式。處理複雜結構時,只需定義對應的 Java Bean,配合 @JsonProperty 等註解即可靈活映射,適合中大型專案。
Gson 是 Google 開源庫,特點是零依賴、API 直觀。它提供兩種核心概念:
無需預先定義實體類,即可靈活遍歷、提取任意深度的巢狀資料,極適合結構不固定或臨時解析場景。
package com.mycompany.gsondata;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class App {
public static void main(String[] args) {
String jsonData = "{\"questionnaireID\": \"QNTest\",\"answerResults\":[{\"questionID\":\"QSTest01\",\"anserContent\":\"cfb7f441-9086-11e3-8cf8-000c2945c442\"},{\"questionID\":\"QSTest01\",\"anserContent\":\"cfb7f441-9086-11e3-8cf8-000c2945c442\"},{\"questionID\":\"QSTest03\",\"anserContent\":\"6b3a9cce-9087-11e3-8cf8-000c2945c442,a086331d-9087-11e3-8cf8-000c2945c442\"},{\"questionID\":\"QSTest01\",\"anserContent\":\"cfb7f441-9086-11e3-8cf8-000c2945c442\"},{\"questionID\":\"QSTest05\",\"anserContent\":\"test測試文字填空\"},{\"questionID\":\"QSTest06\",\"anserContent\":\"3\"},{\"questionID\":\"QSTest07\",\"anserContent\":\"2.2\"}]}";
// 解析根節點
JsonObject root = new JsonParser().parse(jsonData).getAsJsonObject();
System.out.println("問卷ID: " + root.get("questionnaireID").getAsString());
// 遍歷答案陣列
JsonArray answerList = root.getAsJsonArray("answerResults");
for (int i = 0; i < answerList.size(); i++) {
JsonObject ans = answerList.get(i).getAsJsonObject();
System.out.println("題號: " + ans.get("questionID").getAsString());
System.out.println("答案: " + ans.get("anserContent").getAsString());
}
}
}
| 場景 | 推薦庫 | 理由 |
|---|---|---|
| Spring Boot 專案、高效能需求 | Jackson | 生態完善、預設整合、流式解析省記憶體 |
| Android / 輕量專案、結構動態 | Gson | 零依賴、API 簡潔、動態解析靈活 |
| 舊專案維護 | JSON-lib | 僅作相容,不建議新專案使用 |
現代 Java 開發中,Jackson 與 Gson 為雙雄。若專案已使用 Spring 生態,Jackson 為自然之選;若需極簡依賴或處理非固定結構 JSON,Gson 的 JsonObject/JsonArray 模式極具優勢。根據團隊熟悉度與專案屬性選型即可。