Jackson 是 Java 生態中效能最強、依賴最少的 JSON 庫。本文針對四種常見複雜場景給出標準轉換代碼:單一物件、List 集合、物件內含集合、集合內物件再含集合。
ObjectMapper.readValue(json, Class<T>):簡單物件/陣列轉換。ObjectMapper.readValue(json, JavaType):泛型集合轉換關鍵,透過 TypeFactory.constructParametricType(List.class, ElementClass) 建立帶泛型資訊的 JavaType。ObjectMapper mapper = new ObjectMapper();
// 1. JSON -> 單一物件
String json1 = "{\"UserID\":1,\"LoginName\":\"唐工\"...}";
User u = mapper.readValue(json1, User.class);
// 2. JSON -> List
String json2 = "[{\"UserID\":1,...}]";
JavaType listType = mapper.getTypeFactory().constructParametricType(List.class, User.class);
List list = mapper.readValue(json2, listType);
// 3. JSON -> 物件內含集合 (User 包含 List)
String json3 = "{\"UserID\":1,...,\"RoleList\":[{\"Roleid\":0,...}]}";
User u3 = mapper.readValue(json3, User.class); // 直接支援巢狀集合
// 4. JSON -> 集合內物件再含集合
String json4 = "[{\"UserID\":1,...,\"RoleList\":[...]}, {\"UserID\":2,...}]";
JavaType complexType = mapper.getTypeFactory().constructParametricType(List.class, User.class);
List complexList = mapper.readValue(json4, complexType);
List<ConcreteClass> 而非介面,利於 Jackson 反序列化時確定具體類型。@JsonProperty("fieldName") 映射。JsonSerializer/Deserializer 或模組 (如 JavaTimeModule)。對於超大 JSON,可使用 JsonParser 逐 Token 解析,避免一次性載入記憶體,範例中 jsonStreamConverObject 示範了透過 InputStreamReader 流式讀取並轉換。