ObjectMapper:Java 數據處理利器
前言
無論是前后端數據交互,還是數據持久化,都離不開這一過程。ObjectMapper 作為 Jackson 庫的核心類,憑借其強大且靈活的功能,成為了 Java 開發者處理 JSON 數據的得力助手。
基礎概念
ObjectMapper 是 Jackson 庫中用于將 Java 對象轉換為 JSON 格式(序列化),以及將 JSON 格式轉換回 Java 對象(反序列化)的核心類。它提供了一系列方法,支持多種數據格式的讀寫,包括 JSON、XML、YAML 等,不過最常用的還是 JSON 處理。通過 ObjectMapper,開發者可以輕松實現對象與 JSON 字符串之間的雙向轉換,極大地簡化了數據處理流程。
基本使用
序列化:Java 對象轉 JSON
public class SerializationExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
user.setName("Alice");
user.setAge(25);
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
反序列化:JSON 轉 Java 對象
public class DeserializationExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"name\":\"Bob\",\"age\":30}";
User user = objectMapper.readValue(json, User.class);
System.out.println("Name: " + user.getName() + ", Age: " + user.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
}
高級特性
通常默認的序列化和反序列化方式不能滿足需求,這時可以自定義序列化和反序列化邏輯。Jackson 提供了JsonSerializer和JsonDeserializer接口來實現這一功能。
自定義序列化和反序列化
public class CustomAgeSerializer extends JsonSerializer<Integer> {
@Override
public void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString("Age: " + value);
}
}
反序列化的自定義方式類似,通過實現JsonDeserializer接口并使用@JsonDeserialize注解來指定。
忽略屬性
public class User {
private String name;
@JsonIgnore
private int age;
// 省略getter和setter方法
}
此外,還可以通過ObjectMapper的setSerializationInclusion方法來設置全局的屬性包含策略,例如只序列化非空屬性:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
性能優化
由于創建ObjectMapper實例的開銷較大,特別是在頻繁進行序列化和反序列化操作的場景下,應該盡量重用ObjectMapper實例??梢詫bjectMapper實例定義為單例模式,或者在應用啟動時創建一個全局的ObjectMapper實例供各處使用。
public class JsonUtils {
private static final ObjectMapper OBJECT_MAPPER;
static {
OBJECT_MAPPER = new ObjectMapper();
// 配置:遇到未知屬性不拋出異常
OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 配置:日期時間格式使用ISO標準格式
OBJECT_MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// 注冊Java 8日期時間模塊
OBJECT_MAPPER.registerModule(new JavaTimeModule());
}
/**
* 將Java對象轉換為JSON字符串
*
* @param object 待轉換的Java對象
* @return JSON字符串
*/
public static String toJsonString(Object object) {
try {
return OBJECT_MAPPER.writeValueAsString(object);
} catch (JsonProcessingException e) {
throw new RuntimeException("序列化對象為JSON字符串失敗", e);
}
}
/**
* 將JSON字符串轉換為指定類型的Java對象
*
* @param json JSON字符串
* @param clazz 目標Java類
* @param <T> 目標Java類的類型參數
* @return 轉換后的Java對象
*/
public static <T> T fromJsonString(String json, Class<T> clazz) {
try {
return OBJECT_MAPPER.readValue(json, clazz);
} catch (JsonProcessingException e) {
throw new RuntimeException("反序列化JSON字符串為Java對象失敗", e);
}
}
}