前後端關於LocalDateTime的轉換問題
阿新 • • 發佈:2020-06-24
問題:
1.想返回指定的格式,比如時間戳或者指定的字串格式。
2.想接收指定的格式,比如時間戳或者字串(預設要帶T才行,可以設定成不帶T)。
3.想全域性設定。
複製程式碼
原理:
重新定義LocalDateTime的序列化方式和反序列化方式。
序列化: 把物件轉化為位元組。 (指定返回格式)
反序列化: 把位元組轉化為物件。(接收指定格式)
LocalDateTime序列化與反序列化的核心類:
com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer的deserialize方法
com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer的serialize方法
ObjectMapper 給 指定類 設定 序列化方式
複製程式碼
檔案:
檢視原始碼
複製程式碼
步驟:
1.建立LocalDateTimeSerializer類(為了返回時間戳)
2.重定義mapperObject的Bean.
複製程式碼
1 建立LocalDateTimeSerializer類(自定義序列化方式,返回時間戳):
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
/**
* 處理localdatetime 不返回時間戳的問題
*
* @author dripy
* @date 2019/12/17 20:08
*/
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime local DateTime,JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException,JsonProcessingException {
jsonGenerator.writeNumber(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
}
}
複製程式碼
2 重定義mapperObject的Bean:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* @author dripy
* @date 2019/12/17 20:08
*/
@Configuration
public class Config {
/**
* 設定localdatetime的序列化與反序列化的方式
*
* @return
*/
@Bean(name = "mapperObject")
public ObjectMapper getObjectMapper() {
ObjectMapper om = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
// "下面兩個根據實際情況選擇 看要返回什麼格式"
// "返回時間戳 注意這裡的LocalDateTimeSerializer是上面自己實現的一個"
// javaTimeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer());
// "返回指定字串格式 這裡的LocalDateTimeSerializer是com.fasterxml.jackson.datatype.jsr310.ser下的"
javaTimeModule.addSerializer(LocalDateTime.class,new com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// 這個反序列化。接受前端傳來的格式
javaTimeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// 這兩個得加上。不然他倆預設返回了List結構
javaTimeModule.addSerializer(LocalDate.class,new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addSerializer(LocalTime.class,new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
om.registerModule(javaTimeModule);
return om;
}
}
複製程式碼
補充:
核心類:
com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer的deserialize方法
com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer的serialize方法
可嘗試在這兩個方法中打上斷點。檢視請求與返回的時候使用的是什麼格式的DateTimeFormatter
複製程式碼
盡然知道了原理。就知道怎麼改變了。
1.接收yyyy-MM-dd HH:mm:ss格式
2.接收時間戳格式
3.返回yyyy-MM-dd HH:mm:ss格式
4.返回時間戳格式
複製程式碼