Jackson ObjectMapper: Java 序列化的強大工具

一、簡介

Jackson 是一個高效、功能強大的 Java 庫,用來處理 JSON 數據格式。它提供了兩個核心接口:

  • JsonParser 用來解析 JSON 數據流。
  • ObjectMapper 用來解析和生成 JSON 數據,也可以用來處理 Java 對象和 JSON 字符串之間的轉換。

Jackson 將 Java 對象序列化為 JSON 格式的過程大大簡化了我們的開發任務,而它的核心類 ObjectMapper 則是實現這一功能的核心。

二、基礎用法

使用 ObjectMapper 將 Java 對象序列化為 JSON 格式的過程非常簡單:

public class Person {
    private String name;
    private int age;

    // getters and setters
}

ObjectMapper objectMapper = new ObjectMapper();
Person person = new Person("Alex", 28);
String json = objectMapper.writeValueAsString(person);
System.out.println(json);

一行代碼就將 Person 對象序列化成了下面的 JSON 字符串:

{"name":"Alex","age":28}

Jackson 自動將每個屬性轉換成 JSON 格式,如果你需要更改某個屬性的名稱,可以使用 @JsonProperty 註解。

三、高級用法

1. 支持 Java 8 時間 API

從 Jackson 2.8.1 版本開始,可以支持 Java 8 時間 API 的序列化和反序列化。

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

配置完成後,我們可以將 LocalDate、LocalTime、Instant 類型轉換成 ISO8601 格式的字符串。

2. 忽略空屬性

在序列化過程中,我們可以使用 @JsonInclude(JsonInclude.Include.NON_NULL) 註解或者通過配置 ObjectMapper 來實現忽略空屬性的功能。

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
    private String name;
    private Integer age;
    private String email;

    // getters and setters
}

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

以上代碼將忽略 Person 對象中值為 null 的屬性,不會將它們寫入 JSON 字符串中。

3. 處理 JSON 嵌套

Jackson 可以自動序列化和反序列化 JSON 數據嵌套的 Java 對象,無需我們手動處理。

public class Address {
    private String street;
    private String city;
    private String country;

    // getters and setters
}

public class Person {
    private String name;
    private Address address;

    // getters and setters
}

ObjectMapper objectMapper = new ObjectMapper();
Person person = new Person("Alex", new Address("Main St.", "San Francisco", "USA"));
String json = objectMapper.writeValueAsString(person);

以上代碼將序列化出一個包含嵌套 JSON 數據的字符串:

{"name":"Alex","address":{"street":"Main St.","city":"San Francisco","country":"USA"}}

4. 處理 JSON 數組

Jackson 可以處理 JSON 數組,將它們轉換成 Java 中的 List 或數組類型。

public class Person {
    private String name;
    private List<String> hobbies;

    // getters and setters
}

ObjectMapper objectMapper = new ObjectMapper();
Person person = new Person("Alex", Arrays.asList("swimming", "reading", "traveling"));
String json = objectMapper.writeValueAsString(person);

以上代碼將生成一個包含 JSON 數組的字符串:

{"name":"Alex","hobbies":["swimming","reading","traveling"]}

5. 自定義序列化和反序列化

有時候,我們需要自定義序列化和反序列化的行為,例如將 Java 類型 BigDecimal 序列化成字符串類型而不是數字類型,或者從 JSON 串中讀取時間戳並轉換成本地時間對象。

我們可以通過編寫 JsonSerializerJsonDeserializer 來實現這些自定義行為。下面是一個將時間戳轉換成本地時間對象的例子:

public class LocalDateTimeJsonDeserializer extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        long epochMillis = p.getValueAsLong();
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMillis), ZoneId.systemDefault());
    }
}

ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(LocalDateTime.class, new LocalDateTimeJsonDeserializer());
objectMapper.registerModule(module);

以上代碼將用自定義的 JsonDeserializer 對象來反序列化 LocalDateTime 類型。

四、結語

Jackson ObjectMapper 是 Java 序列化中的一個強大工具,可大大簡化我們的開發任務。我們可以使用它來將 Java 對象序列化為 JSON 字符串,也可以將 JSON 數據轉換成 Java 對象。

在實際使用中,我們可以利用各種功能,如支持 Java 8 時間 API、自定義序列化和反序列化等,來處理不同的業務需求。

更多高級用法和 API 請參考官方文檔:https://github.com/FasterXML/jackson-databind

原創文章,作者:LREXI,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/334137.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LREXI的頭像LREXI
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

相關推薦

  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 如何通過jstack工具列出假死的java進程

    假死的java進程是指在運行過程中出現了某些問題導致進程停止響應,此時無法通過正常的方式關閉或者重啟該進程。在這種情況下,我們可以藉助jstack工具來獲取該進程的進程號和線程號,…

    編程 2025-04-29
  • Python最強大的製圖庫——Matplotlib

    Matplotlib是Python中最強大的數據可視化工具之一,它提供了海量的製圖、繪圖、繪製動畫的功能,通過它可以輕鬆地展示數據的分佈、比較和趨勢。下面將從多個方面對Matplo…

    編程 2025-04-29
  • 註冊表取證工具有哪些

    註冊表取證是數字取證的重要分支,主要是獲取計算機系統中的註冊表信息,進而分析痕迹,獲取重要證據。本文將以註冊表取證工具為中心,從多個方面進行詳細闡述。 一、註冊表取證工具概述 註冊…

    編程 2025-04-29
  • Python range: 強大的迭代器函數

    Python range函數是Python中最常用的內置函數之一。它被廣泛用於for循環的迭代,列表推導式,和其他需要生成一系列數字的應用程序中。在本文中,我們將會詳細介紹Pyth…

    編程 2025-04-29
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文將從多個方面深入探討Java反序列化漏洞,對於筆者所總結的經驗和教訓,以及掌握Java反序列化的設計模式、最佳實踐和防範措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    編程 2025-04-28
  • Python運維工具用法介紹

    本文將從多個方面介紹Python在運維工具中的應用,包括但不限於日誌分析、自動化測試、批量處理、監控等方面的內容,希望能對Python運維工具的使用有所幫助。 一、日誌分析 在運維…

    編程 2025-04-28
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • Trocket:打造高效可靠的遠程控制工具

    如何使用trocket打造高效可靠的遠程控制工具?本文將從以下幾個方面進行詳細的闡述。 一、安裝和使用trocket trocket是一個基於Python實現的遠程控制工具,使用時…

    編程 2025-04-28

發表回復

登錄後才能評論