Commit 472ff81dd9d1ab7615bad57829270da439530cc6
Committed by
Gitee
!17 新增序列化Long类型,自动转为字符串类型,避免前端丢失精度
Merge pull request !17 from 贺小五/feature/serialized
Showing
3 changed files
with
68 additions
and
1 deletions
src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java
| 1 | package cn.iocoder.dashboard.framework.jackson.config; | 1 | package cn.iocoder.dashboard.framework.jackson.config; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.dashboard.framework.jackson.deser.LocalDateTimeDeserializer; | ||
| 4 | +import cn.iocoder.dashboard.framework.jackson.ser.LocalDateTimeSerializer; | ||
| 3 | import cn.iocoder.dashboard.util.json.JsonUtils; | 5 | import cn.iocoder.dashboard.util.json.JsonUtils; |
| 4 | import com.fasterxml.jackson.databind.ObjectMapper; | 6 | import com.fasterxml.jackson.databind.ObjectMapper; |
| 7 | +import com.fasterxml.jackson.databind.module.SimpleModule; | ||
| 8 | +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; | ||
| 5 | import org.springframework.context.annotation.Bean; | 9 | import org.springframework.context.annotation.Bean; |
| 6 | import org.springframework.context.annotation.Configuration; | 10 | import org.springframework.context.annotation.Configuration; |
| 7 | 11 | ||
| 12 | +import java.time.LocalDateTime; | ||
| 13 | + | ||
| 8 | @Configuration | 14 | @Configuration |
| 9 | public class JacksonConfig { | 15 | public class JacksonConfig { |
| 10 | 16 | ||
| 11 | @Bean | 17 | @Bean |
| 12 | @SuppressWarnings("InstantiationOfUtilityClass") | 18 | @SuppressWarnings("InstantiationOfUtilityClass") |
| 13 | public JsonUtils jsonUtils(ObjectMapper objectMapper) { | 19 | public JsonUtils jsonUtils(ObjectMapper objectMapper) { |
| 20 | + SimpleModule simpleModule = new SimpleModule(); | ||
| 21 | + /* | ||
| 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); | ||
| 31 | + | ||
| 14 | JsonUtils.init(objectMapper); | 32 | JsonUtils.init(objectMapper); |
| 15 | return new JsonUtils(); | 33 | return new JsonUtils(); |
| 16 | } | 34 | } |
| 17 | - | ||
| 18 | } | 35 | } |
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/LocalDateTimeSerializer.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.framework.jackson.ser; | ||
| 2 | + | ||
| 3 | +import com.fasterxml.jackson.core.JsonGenerator; | ||
| 4 | +import com.fasterxml.jackson.databind.JsonSerializer; | ||
| 5 | +import com.fasterxml.jackson.databind.SerializerProvider; | ||
| 6 | + | ||
| 7 | +import java.io.IOException; | ||
| 8 | +import java.time.LocalDateTime; | ||
| 9 | +import java.time.ZoneId; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * LocalDateTime序列化规则 | ||
| 13 | + * <p> | ||
| 14 | + * 会将LocalDateTime序列化为毫秒级时间戳 | ||
| 15 | + */ | ||
| 16 | +public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> { | ||
| 17 | + | ||
| 18 | + public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer(); | ||
| 19 | + | ||
| 20 | + @Override | ||
| 21 | + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { | ||
| 22 | + gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); | ||
| 23 | + } | ||
| 24 | +} |