Commit 4067087da6f8615ef3ad07ed03c8332be18e1c90
1 parent
fe31d61d
移除自定义的Long序列化字符串类型规则
新增LocalDateTime的序列化、反序列化规则
Showing
3 changed files
with
48 additions
and
16 deletions
src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java
| 1 | 1 | package cn.iocoder.dashboard.framework.jackson.config; |
| 2 | 2 | |
| 3 | -import cn.iocoder.dashboard.framework.jackson.ser.LongSerializer; | |
| 3 | +import cn.iocoder.dashboard.framework.jackson.deser.LocalDateTimeDeserializer; | |
| 4 | +import cn.iocoder.dashboard.framework.jackson.ser.LocalDateTimeSerializer; | |
| 4 | 5 | import cn.iocoder.dashboard.util.json.JsonUtils; |
| 5 | 6 | import com.fasterxml.jackson.databind.ObjectMapper; |
| 6 | 7 | import com.fasterxml.jackson.databind.module.SimpleModule; |
| 8 | +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; | |
| 7 | 9 | import org.springframework.context.annotation.Bean; |
| 8 | 10 | import org.springframework.context.annotation.Configuration; |
| 9 | 11 | |
| 12 | +import java.time.LocalDateTime; | |
| 13 | + | |
| 10 | 14 | @Configuration |
| 11 | 15 | public class JacksonConfig { |
| 12 | 16 | |
| ... | ... | @@ -15,11 +19,15 @@ public class JacksonConfig { |
| 15 | 19 | public JsonUtils jsonUtils(ObjectMapper objectMapper) { |
| 16 | 20 | SimpleModule simpleModule = new SimpleModule(); |
| 17 | 21 | /* |
| 18 | - * 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型 | |
| 19 | - */ | |
| 20 | - simpleModule.addSerializer(Long.class,LongSerializer.getInstance()) | |
| 21 | - .addSerializer(Long.TYPE,LongSerializer.getInstance()); | |
| 22 | - objectMapper.registerModule(simpleModule); | |
| 22 | + * 1. 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型 | |
| 23 | + * 2. 新增LocalDateTime序列化、反序列化规则 | |
| 24 | + */ | |
| 25 | + simpleModule.addSerializer(Long.class, ToStringSerializer.instance) | |
| 26 | + .addSerializer(Long.TYPE, ToStringSerializer.instance) | |
| 27 | + .addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE) | |
| 28 | + .addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); | |
| 29 | + | |
| 30 | + objectMapper.registerModules(simpleModule); | |
| 23 | 31 | |
| 24 | 32 | JsonUtils.init(objectMapper); |
| 25 | 33 | return new JsonUtils(); | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/jackson/deser/LocalDateTimeDeserializer.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.framework.jackson.deser; | |
| 2 | + | |
| 3 | +import com.fasterxml.jackson.core.JsonParser; | |
| 4 | +import com.fasterxml.jackson.core.JsonProcessingException; | |
| 5 | +import com.fasterxml.jackson.databind.DeserializationContext; | |
| 6 | +import com.fasterxml.jackson.databind.JsonDeserializer; | |
| 7 | + | |
| 8 | +import java.io.IOException; | |
| 9 | +import java.time.Instant; | |
| 10 | +import java.time.LocalDateTime; | |
| 11 | +import java.time.ZoneId; | |
| 12 | + | |
| 13 | +/** | |
| 14 | + * LocalDateTime反序列化规则 | |
| 15 | + * <p> | |
| 16 | + * 会将毫秒级时间戳反序列化为LocalDateTime | |
| 17 | + */ | |
| 18 | +public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> { | |
| 19 | + | |
| 20 | + public static final LocalDateTimeDeserializer INSTANCE = new LocalDateTimeDeserializer(); | |
| 21 | + | |
| 22 | + @Override | |
| 23 | + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { | |
| 24 | + return LocalDateTime.ofInstant(Instant.ofEpochMilli(p.getValueAsLong()), ZoneId.systemDefault()); | |
| 25 | + } | |
| 26 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LongSerializer.java renamed to src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LocalDateTimeSerializer.java
| ... | ... | @@ -5,22 +5,20 @@ import com.fasterxml.jackson.databind.JsonSerializer; |
| 5 | 5 | import com.fasterxml.jackson.databind.SerializerProvider; |
| 6 | 6 | |
| 7 | 7 | import java.io.IOException; |
| 8 | +import java.time.LocalDateTime; | |
| 9 | +import java.time.ZoneId; | |
| 8 | 10 | |
| 9 | 11 | /** |
| 10 | - * Long类型序列化规则 | |
| 12 | + * LocalDateTime序列化规则 | |
| 11 | 13 | * <p> |
| 12 | - * 数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型 | |
| 14 | + * 会将LocalDateTime序列化为毫秒级时间戳 | |
| 13 | 15 | */ |
| 14 | -public class LongSerializer extends JsonSerializer<Long> { | |
| 16 | +public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> { | |
| 15 | 17 | |
| 16 | - private static final LongSerializer LONG_SERIALIZER = new LongSerializer(); | |
| 18 | + public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer(); | |
| 17 | 19 | |
| 18 | 20 | @Override |
| 19 | - public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException { | |
| 20 | - gen.writeString(value.toString()); | |
| 21 | - } | |
| 22 | - | |
| 23 | - public static LongSerializer getInstance() { | |
| 24 | - return LONG_SERIALIZER; | |
| 21 | + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { | |
| 22 | + gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); | |
| 25 | 23 | } |
| 26 | 24 | } | ... | ... |