一、簡介
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 串中讀取時間戳並轉換成本地時間對象。
我們可以通過編寫 JsonSerializer
和 JsonDeserializer
來實現這些自定義行為。下面是一個將時間戳轉換成本地時間對象的例子:
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