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=false | JSON 含類無字段時不報錯,兼容版本升級 | true (生產環境必開) |
WRITE_DATES_AS_TIMESTAMPS=false | 日期輸出為字符串而非時間戳,可讀性強 | false |
SerializationInclusion.NON_NULL | null 字段不輸出,減小傳輸體積 | 按需開啟 |
// 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>>() {});
mapper.setTimeZone(TimeZone.getTimeZone("GMT+8")) 確保時區一致。List<User> 反序列化必須用 TypeReference 或 JavaType,否則會變成 LinkedHashMap。JsonProcessingException 區分序列化/反序列化錯誤,記錄完整堆棧便於排查。