在 Java 開發中,處理巢狀結構的 JSON 資料是常見需求。本文介紹兩種主流解析方式:使用原生 org.json 逐層解析,以及利用 Google Gson 庫自動映射到遞迴物件模型。兩種方法各有優劣,開發者可根據專案需求選擇。
此方式適合簡單結構或動態解析場景,需手動遍歷 JSON 物件層級。
import org.json.JSONObject;
String jsonStr = "{'name':'111','child':[{'name':'222','child':[{'name':'333'}]},{'name':'2221'}]}";
JSONObject json = new JSONObject(jsonStr);
// 逐層獲取值
String name = json.getString("name");
JSONArray children = json.getJSONArray("child");
// 遞迴處理 child 陣列...
優點:無額外依賴,靈活控制解析邏輯。缺點:程式碼冗長,維護成本高,易出錯。
定義包含自我引用的 MyObject 類別,Gson 即可一次完成反序列化。
import java.util.List;
import com.google.gson.Gson;
public class MyObject {
private String name;
private List<MyObject> child;
// Getter/Setter 省略
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public List<MyObject> getChild() { return child; }
public void setChild(List<MyObject> child) { this.child = child; }
public static void main(String[] args) {
String jsonStr = "{'name':'111','child':[{'name':'222','child':[{'name':'333'}]},{'name':'2221'}]}";
Gson gson = new Gson();
MyObject obj = gson.fromJson(jsonStr, MyObject.class);
// 驗證解析結果
System.out.println(obj.getChild().get(0).getName()); // 222
System.out.println(obj.getChild().get(1).getName()); // 2221
System.out.println(obj.getChild().get(0).getChild().get(0).getName()); // 333
}
}
優點:程式碼簡潔,型別安全,自動處理任意深度巢狀結構。缺點:需引入 Gson 依賴,對極其複雜的動態結構較不靈活。
org.json 或 Jackson JsonNodeGson 的遞迴物件映射極大簡化了多層 JSON 處理,是現代 Java 開發的首選方案。掌握兩種方法,能靈活應對各類 JSON 解析挑戰。