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

Java 實體類轉 JSON 兩大主流方式實戰:Jackson vs JSONObject (json-lib) 代碼對比

     編輯:Java 綜合教學

Java 實體類轉 JSON 兩大主流方式實戰:Jackson vs JSONObject (json-lib) 代碼對比

實體類轉 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":"職員"}
    }
}

方式二:json-lib JSONObject(舊項目常見)


深度對比:為什麼推薦 Jackson?

維度Jacksonjson-lib (JSONObject)
性能極高(流式解析、字節碼生成、零拷貝)一般(反射密集、依賴 ezmorph 轉換)
功能豐富度極強(註解定制、多態、日期格式化、模塊擴展、XML/MessagePack/YAML/Protobuf)基礎(僅基本 POJO 轉換)
依賴體積輕量(核心 3 個 jar:core/annotations/databind)笨重(需 6+ 個第三方 jar)
維護狀態活躍維護,版本迭代快,Spring Boot 默認多年不更新,已停止維護
泛型/容器支持完美(TypeReference 解決類型擦除)弱(需手動處理 List/Map 泛型)
線程安全ObjectMapper 線程安全,可全局單例JSONObject 非線程安全

常見坑點與最佳實踐

  • 日期格式化:Jackson 默認輸出 timestamp (long),加 @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") 或配置 mapper.setDateFormat()。
  • 忽略 Null 字段:@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 進階三板斧。

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