實體類轉 JSON 是前後端分離、微服務通信、日誌記錄的高頻操作。本文對比兩種主流實現:Jackson (現代標準、高性能、功能豐富) 與 json-lib JSONObject (老牌、簡單、依賴多),給出 Maven 依賴、實體類定義、轉換代碼、優缺點對比。
<!-- Jackson (推薦) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<!-- json-lib (舊項目維護) -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- 需額外依賴 ezmorph、commons-lang、commons-beanutils、commons-collections、commons-logging -->
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonInclude;
public class JacksonDemo {
public static void main(String[] args) throws Exception {
Emp emp = new Emp();
emp.setId(1);
emp.setName("張三");
emp.setGender("男");
emp.setDptNo(1);
emp.setDuty("職員");
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null
mapper.enable(SerializationFeature.INDENT_OUTPUT); // 格式化
String json = mapper.writeValueAsString(emp);
System.out.println(json);
// 輸出:{"id":1,"name":"張三","gender":"男","dptNo":1,"duty":"職員"}
}
}
深度對比:為什麼推薦 Jackson?
| 維度 | Jackson | json-lib (JSONObject) |
|---|---|---|
| 性能 | 極高(流式解析、字節碼生成、零拷貝) | 一般(反射密集、依賴 ezmorph 轉換) |
| 功能豐富度 | 極強(註解定制、多態、日期格式化、模塊擴展、XML/MessagePack/YAML/Protobuf) | 基礎(僅基本 POJO 轉換) |
| 依賴體積 | 輕量(核心 3 個 jar:core/annotations/databind) | 笨重(需 6+ 個第三方 jar) |
| 維護狀態 | 活躍維護,版本迭代快,Spring Boot 默認 | 多年不更新,已停止維護 |
| 泛型/容器支持 | 完美(TypeReference 解決類型擦除) | 弱(需手動處理 List/Map 泛型) |
| 線程安全 | ObjectMapper 線程安全,可全局單例 | JSONObject 非線程安全 |
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") 或配置 mapper.setDateFormat()。@JsonInclude(JsonInclude.Include.NON_NULL) (類/字段) 或 mapper.setSerializationInclusion() (全局)。@JsonProperty("custom_name")。@JsonManagedReference + @JsonBackReference 或 @JsonIdentityInfo。mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)。新項目無腦上 Jackson,性能、功能、生態全方位碾壓 json-lib。舊項目維護若無法引入 Jackson,json-lib 仍能應付基本 POJO 轉換。記住:ObjectMapper 單例復用、註解驅動定制、TypeReference 處理泛型 是 Jackson 進階三板斧。