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

Java 後端 JSON 處理核心操作:對象序列化與反序列化實戰

     編輯:Java 綜合教學

Jackson 核心 API 速查:ObjectMapper 兩大核心方法封裝與日期格式化

JSON 是現代 Web API 事実標準。本文封裝基於 Jackson ObjectMapper 的兩個通用靜態方法,覆蓋對象 → JSON 字符串與JSON 字符串 → 對象的核心場景,並解決日期格式化、異常處理、泛型擦除等實戰痛點。

一、 核心工具類代碼

public class JsonUtil {
    private static final ObjectMapper mapper = new ObjectMapper();
    static {
        // 統一日期格式
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        // 忽略未知字段,防止反序列化報錯
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 空值不序列化(可選)
        // mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    }

    /** 對象轉 JSON 字符串 */
    public static String toJson(Object value) {
        try {
            return mapper.writeValueAsString(value);
        } catch (Exception e) {
            log.error("對象轉 JSON 失敗: {}", value, e);
            return null;
        }
    }

    /** JSON 字符串轉指定類型對象(支持泛型) */
    public static <T> T toObject(String json, Class<T> valueType) {
        Assert.hasText(json, "JSON 字符串不能為空");
        Assert.notNull(valueType, "目標類型不能為空");
        try {
            return mapper.readValue(json, valueType);
        } catch (Exception e) {
            log.error("JSON 轉對象失敗: {} -> {}", json, valueType, e);
            return null;
        }
    }

    /** 進階:JSON 轉復雜泛型(如 List<User>) */
    public static <T> T toObject(String json, TypeReference<T> typeRef) {
        try {
            return mapper.readValue(json, typeRef);
        } catch (Exception e) {
            log.error("JSON 轉泛型對象失敗", e);
            return null;
        }
    }
}

二、 關鍵配置詳解

配置項作用推薦值
setDateFormat統一日期序列化/反序列化格式yyyy-MM-dd HH:mm:ss 或 ISO-8601
FAIL_ON_UNKNOWN_PROPERTIES=falseJSON 含類無字段時不報錯,兼容版本升級true (生產環境必開)
WRITE_DATES_AS_TIMESTAMPS=false日期輸出為字符串而非時間戳,可讀性強false
SerializationInclusion.NON_NULLnull 字段不輸出,減小傳輸體積按需開啟

三、 使用示例

// 1. 對象 → JSON
User user = new User(1L, "張三", new Date());
String json = JsonUtil.toJson(user);
// {"id":1,"name":"張三","createTime":"2024-01-15 14:30:00"}

// 2. JSON → 對象
String jsonStr = "{\"id\":2,\"name\":\"李四\",\"createTime\":\"2024-01-15 15:00:00\"}";
User u = JsonUtil.toObject(jsonStr, User.class);

// 3. JSON → List<User> (泛型擦除需 TypeReference)
List<User> list = JsonUtil.toObject(jsonArrayStr, new TypeReference<List<User>>() {});

四、 避坑指南

  1. 單例 ObjectMapper:線程安全,全局唯一實例,避免重複創建開銷。
  2. 日期時區:mapper.setTimeZone(TimeZone.getTimeZone("GMT+8")) 確保時區一致。
  3. 泛型擦除:List<User> 反序列化必須用 TypeReference 或 JavaType,否則會變成 LinkedHashMap。
  4. 異常處理:捕獲 JsonProcessingException 區分序列化/反序列化錯誤,記錄完整堆棧便於排查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved